2011-02-01 97 views
37

好的,我到处搜索,似乎无法找到详细的资源在线如何解释Apache的ab服务器基准测试工具的结果。我已经用我认为是截然不同的参数进行了几次测试,但看到了非常相似的结果(我很难认为这意味着我的网站正在完美扩展!)。如果有人可以指点我的详细资源,关于如何理解这个测试的结果,或者如果有人想在这里创建一个,我认为这对我和其他人非常有用。我该如何解释Apache的ab基准测试工具的结果?

回答

28

令人沮丧的是,不是吗?我正在尝试做同样的事情,看看我的新配置和配置的专用服务器与其他服务器相比如何。

我正在做的是将我目前的生产服务器(双核4GB RAM)与新服务器(四核8GB RAM)进行比较。

由于生产服务器正在运行,我不想为我的用户“破坏”服务器,因此我需要并肩比较“发挥出色”。

当前比较VS新用下面的命令一个PHP页面,只是调用phpinfo上():AB -kc 20 -t 60

在我目前的生产服务器上,我看到类似以下,它不可能完成的任务在给定的时间量:

Time taken for tests: 60.1234 seconds 
Complete requests: 24538 
Failed requests: 58 
(Connect: 0, Length: 58, Exceptions: 0) 
Requests per second: 408.96 [#/sec] (mean) 
Time per request: 48.905 [ms] (mean) 
Time per request: 2.445 [ms] (mean, across all concurrent requests) 

VS其完成的时间的一半量的全部测试新的服务器上执行以下操作:

Time taken for tests: 29.838791 seconds 
Complete requests: 50000 
Failed requests: 11 
(Connect: 0, Length: 11, Exceptions: 0) 
Requests per second: 1675.67 [#/sec] (mean) 
Time per request: 11.936 [ms] (mean) 
Time per request: 0.597 [ms] (mean, across all concurrent requests) 

现在,这不是一个“公平”的测试,因为除了基准测试以外,当前的服务器正在处理20个网站。另外,它真的只测试apache & php。

把对我的更复杂的主页一个此相同的测试,一个是“感觉”当前服务器上的慢,我看到以下内容: 当前服务器:

Time taken for tests: 60.14170 seconds 
Complete requests: 510 
Requests per second: 8.50 [#/sec] (mean) 
Time per request: 2353.497 [ms] (mean) 
Time per request: 117.675 [ms] (mean, across all concurrent requests) 

新服务器:

Time taken for tests: 60.18651 seconds 
Complete requests: 1974 
Requests per second: 32.89 [#/sec] (mean) 
Time per request: 608.092 [ms] (mean) 
Time per request: 30.405 [ms] (mean, across all concurrent requests) 

这个测试是加载一个Joomla CMS动态生成的页面。这更像是一种“真实世界”测试。同样,新服务器不处理当前的网站流量,所以它不是苹果来比较苹果。我不想更难测试,或者我在我的网站上冒着最终用户的体验风险。

将站点迁移到新服务器后,我打算再次执行上述测试,以便我可以看到影响我的常规站点流量对基准测试的影响。同样的机器生产与闲置的基准测试结果。

现在,我也在考虑强调新服务器并确保它反应良好。 运行命令AB -n 50000 -c 200我看顶部命令,并看到多少CPU &内存正在使用的同时,也* F5 *荷兰国际集团在我的浏览器页面,看看我是否得到任何错误以及感受服务器响应需要多长时间。

我的第一个测试给了我:

Concurrency Level: 200 
Time taken for tests: 692.160011 seconds 
Complete requests: 50000 
Failed requests: 30102 
(Connect: 0, Length: 30102, Exceptions: 0) 
Write errors: 0 
Non-2xx responses: 30102 
Total transferred: 456568770 bytes 
HTML transferred: 442928962 bytes 
Requests per second: 72.24 [#/sec] (mean) 
Time per request: 2768.640 [ms] (mean) 
Time per request: 13.843 [ms] (mean, across all concurrent requests) 
Transfer rate: 644.17 [Kbytes/sec] received 

注意很高的失败请求速率。我的apache被设置为最多可同时处理250个请求,但我的MySQL只有175个。MySQL在这里是失败点。它无法处理来自Apache的所有请求。我的网页浏览器页面加载给我一个很多页面刷新的MySQL连接错误页面。所以,我把MySQL撞到了300个同步请求中(我已经做过了,但忘记重新启动MySQL了,所以这个测试结果很不错 - 我已经确定了一个需要的改变,并且意外地做了一个经验证明测试验证更改的必要性)。

下运行给我的结果如下:

Concurrency Level:  200 
Time taken for tests: 1399.999463 seconds 
Complete requests:  50000 
Failed requests:  5054 
    (Connect: 0, Length: 5054, Exceptions: 0) 
Write errors:   0 
Non-2xx responses:  5054 
Total transferred:  1016767290 bytes 
HTML transferred:  995713274 bytes 
Requests per second: 35.71 [#/sec] (mean) 
Time per request:  5599.998 [ms] (mean) 
Time per request:  28.000 [ms] (mean, across all concurrent requests) 
Transfer rate:   709.24 [Kbytes/sec] received 

这花长两倍以上,但失败的请求率远低得多。基本上,服务器现在被配置为能够处理我网站主页中的至少200个同时页面浏览,但每页需要5秒才能提供服务。不是很好,但比我之前得到的MySQL错误要好得多。

在所有这些过程中,我的服务器CPU使用率与“负载平均值”徘徊在180以上时的100%挂钩。MySQL正在使用大约8-9%的CPU,并且没有使用大量的RAM I已经分配了它,因为我只是反复敲击相同的页面,所以它只处理单个数据库。 400MB的4GB +配置成长。 top显示缓存和缓存的内存使用率约占总可用内存的50%。所以当我用这个测试加载机器时,它并没有接近过载点。在真实世界的数据库使用情况下,MySQL应该占用我分配的大部分内存,所以服务器应该在这一点上接近满负荷。

我的下一个测试是在250个连接的“满载” AB -n 50000 -c 250

Concurrency Level:  250 
Time taken for tests: 1442.515514 seconds 
Complete requests:  50000 
Failed requests:  3509 
    (Connect: 0, Length: 3509, Exceptions: 0) 
Write errors:   0 
Non-2xx responses:  3509 
Total transferred:  1051321215 bytes 
HTML transferred:  1029809879 bytes 
Requests per second: 34.66 [#/sec] (mean) 
Time per request:  7212.577 [ms] (mean) 
Time per request:  28.850 [ms] (mean, across all concurrent requests) 
Transfer rate:   711.73 [Kbytes/sec] received 

这是示出类似的结果,以与适当的MySQL 200连接测试,测试apache的连接帽。我认为这对我很好。我不喜欢7秒钟返回一个页面,但我想我可以通过在Joomla中缓存Joomla中的缓存或者使用已安装但尚未被Joomla使用的Memcache来改善Joomla的性能。

试图推动我的运气,我想我会尝试300同时连接。 ab -n 50000 -c 300浏览器显示等待快速页面加载。否则,结果并没有真正的改变。

Concurrency Level:  300 
Time taken for tests: 1478.35890 seconds 
Complete requests:  50000 
Failed requests:  2266 
    (Connect: 0, Length: 2266, Exceptions: 0) 
Write errors:   0 
Non-2xx responses:  2266 
Total transferred:  1079120910 bytes 
HTML transferred:  1057241646 bytes 
Requests per second: 33.83 [#/sec] (mean) 
Time per request:  8868.215 [ms] (mean) 
Time per request:  29.561 [ms] (mean, across all concurrent requests) 
Transfer rate:   712.99 [Kbytes/sec] received 

我不知道我的这些结果的解释是“正确的”,或者如果我失去了一些东西旅游居停,但缺乏指导,我能找到的,这是我想出了。

我刚刚使用了结果来确保我得到了很好的响应率 - 缺乏完美的响应率关系到我,但我不知道如何以某种方式查看或重现失败,我可以检查它们。

每个请求的缓慢时间也与我有关,但我认为我可以在应用程序层解决很多问题。

我相信虽然服务器会慢慢爬行,但它可以处理沉重的负载情况。

在这些基准测试之后,研究像MonYog这样的其他性能调整工具也显示了我目前的配置“足够好”。

我希望有一个地方,人们发布测试结果,我可以用硬件描述和软件配置复制,所以我知道我是否'具有竞争力',或者如果我有很多工作还没有最好地利用我的设备。因此,为什么我张贴我的结果。

+2

我想你可能会曲解失败的请求行,另请参阅我的答案。 – amarillion 2011-09-28 13:12:02

+0

感谢您的澄清amarillion – creuzerm 2011-12-13 20:06:42

1

在一个侧面说明,AB是单线程(这是老单核CPU,如2001年的Pentium 4 OK)。

要测试承载Web服务器的多核CPU(使用多个进程的Nginx/Lighty,使用多个线程的Apache),您应该使用Weighttp(与AB兼容)。

“Weighttp -t 6”将运行6个客户端线程(相反,“AB -t 6”将运行6秒测试)。

通过使用多个客户端线程(与网络服务器工作人员的数量相同 - 应与服务器的CPU核心数量相匹配),您将获得更多相关结果。

1
Time per request:  7.303 [ms] (mean) 
Time per request:  0.730 [ms] (mean, across all concurrent requests) 

第一个是有关的平均时间为每并发用户的请求之间的差别非常好的链接所以如果你正在对1000个请求和200个并发用户进行测试,那么第一个将是每个200请求的平均时间。 第二个涉及整个请求时间,这是整个1000请求的平均时间