【问题标题】:Is this a bad way to do server load testing?这是进行服务器负载测试的坏方法吗?
【发布时间】:2012-01-04 21:44:24
【问题描述】:

我正在开发一个PHP-MySQL Web 应用程序,而用于服务器负载测试的可用工具既麻烦又令人困惑。所以我想我会试试这个,我想知道这是否是一个坏主意:

  • 在每个页面的输出中添加页面生成时间和memory_get_usage()
  • 使用 jQuery、AJAX 和 setInterval 每秒点击页面 n 次,记录时间/内存消耗。

这里是 Javascript 和标记:

<script>
function roundNumber(num, dec) {
    var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
    return result;
}

$(function(){

totalCount = 0;
i = 1;
totalTime = 0;
highest = 0;
memoryUsage = 0;

var hitsPerSecond = 1000;
var totalLimit = 100;

function testLoad(){

            
    if (totalCount <= totalLimit){
        
        $.get('/lp/user-page.php', function(data){
            $(data).filter('#page-generation-time').each(function(){
                totalTime += parseFloat($(this).text());
                $('.console').append('<p>('+i+') - Load time: '+$(this).text()+'</p>');
                            i++;
                            if (highest < $(this).text()){
                                highest = $(this).text();
                            }
                            $('.average').html('Average: '+roundNumber(totalTime/i, 5)+' - Highest: '+highest);
            });
            $(data).filter('#page-memory-usage').each(function(){
                memoryUsage = parseFloat($(this).text());
                $('.memory').html($(this).text());
            });


        });
        
        
    } else {
        clearInterval(testLoadInterval);
    }
    
    totalCount++;

};


var testLoadInterval = setInterval(function(){ testLoad(); }, 1000/hitsPerSecond);

});

</script>

<h2>Load Test</h2>
<div class="average"></div>
<div class="memory"></div>
<div class="console-container">
    <div class="console"></div>
</div>

这是一种非常愚蠢/不准确的负载测试方法吗?因为它似乎有它的优点:

  • 重量轻且易于实施。
  • 使用真实浏览器加载整个页面。
  • 跟踪平均页面加载时间并直接在浏览器中记录结果。

但我真的没有任何参考框架来知道我得到的数字是否正确。感谢任何可以告诉我我是否完全错误的人,以及是否有比 jMeter 更易于用户使用的东西。

更新

不要将此作为服务器负载测试的方法。它不会给你一个准确的读数。

使用上面的代码,我能够以“1,000”秒的负载命中服务器,几乎没有问题。在对 ApacheBench 进行了同样的尝试后,我发现这绝不是现实的反映。

使用 ApacheBench,我能够通过使用 40 个(!)并发连接访问应用程序来使服务器崩溃。

显然,我正在重写应用程序的某些部分,以尽可能使用缓存的 HTML。

所以,回答我自己的问题,是的,这是进行服务器测试的不好方法。

【问题讨论】:

  • 明显的潜在陷阱:GET 查询可以被缓存,因此您可能只会通过一次点击“给服务器施加压力”,之后它就是纯粹的浏览器内操作。
  • 取决于您的服务器设置,恕我直言,这是测试单个 Web 服务器的好方法,但是当在负载均衡器后面运行多个服务器时,如果您有 IP 固定,这将不会给出非常准确的结果。
  • 基准测试工具旨在模拟多用户环境,其中 JavaScript 是单用户环境。不是真正的苹果对苹果的比较。
  • 这个比siege http://yourwebsite.com/lp/user-page.php方便吗?

标签: php javascript testing load


【解决方案1】:

这不是最糟糕的想法,但正如 cmets 中提到的那样,它存在一些问题。

您肯定会遇到的一个问题是缓存。只要确保在您使用的任何浏览器中关闭缓存即可。注意:我在关闭 Chrome 缓存时遇到了一些问题,Chrome 仍然坚持提供缓存的内容,因此请注意这一点。

除了缓存之外,这并不是最准确的处理方式。即使它确实模拟了真实的浏览器负载,它也只模拟了一个连接。这基本上模拟了一个用户多次刷新该单个页面,不是很准确。

我肯定会使用 apache bench 来处理并发连接。类似的东西

ab -n 1000 -c 10 http://www.your_url.com/

根据您的服务器更改这些数字。该示例将运行 1000 个请求,一次 10 个。

如果您想从您的 javascript 基准测试中检查数字的“准确性”,您可以做的一件事是运行 apache bench 并获取一些基线无浏览器数量估计值,然后运行您的基准测试脚本并查看如何接近结果是。

另一个很棒的工具是Siege。安装起来并不难,如果你真的想准确地测试性能,它是非常值得的。但是,如果您正在寻找非常用户友好的东西,那可能不是您的理想选择。

您可以使用的另一个具有漂亮界面的潜在工具是Charles

虽然它并不是真正为负载测试而设计的,但它确实具有可以运行重复并发请求的功能(类似于 apache bench),并且它具有漂亮的界面。

还有很多选择,但它们可能对您来说不够友好,所以我不会详细介绍

我过去使用的一个不错的付费选项(他们会在向您收费之前给您一些试运行)选项是 LoadImpact

如果您想进行任何真正繁重的测试,这有点贵,但它确实模拟了并发浏览器负载,并允许您编写一个“路径”脚本,让模拟用户相当容易地通过您的网站。如果您正在寻找一个非常用户友好且准确度相对较高的解决方案,我肯定会推荐他们(如果您有现金的话)。

另一个潜在的付费解决方案是CapCal

不过,我对他们的了解并不多。看起来他们也可能有某种免费试用。

【讨论】:

  • Jmeter 是另一个不错的免费工具,如果您可以访问它,Visual Studio 负载测试非常好,但需要许可证。
  • 是的,JMeter 绝对是一个很棒的工具,但从他的问题来看,他似乎已经在使用它了。我从未尝试过 Visual Studio 负载测试,它是否只针对 Windows 服务器运行测试?
  • @WilliamKing,感谢您的意见。我将尝试使用 Apache Bench,看看在我关闭缓存后这些数字还有多远。我也会给 Siege 一个机会。
  • @WilliamKing - 差点忘了; Apache Bench 可以模拟 cookie 吗?用户必须登录才能加载他们的页面。
  • @CarterFort 是的,它可以,虽然我只使用过一次,但恐怕我无法对此提供非常深入的了解。在此处阅读更多信息:httpd.apache.org/docs/2.0/programs/ab.html
猜你喜欢
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
相关资源
最近更新 更多