【发布时间】: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