我该如何解释Apache的ab基准测试工具的结果?

Nic*_*ick 40 apache benchmarking scalability

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

小智 30

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

我最终要做的是将我当前的生产服务器(双核4GB RAM)与新服务器(四核8GB RAM)进行比较.

我需要与我的并排比较"玩得很好",因为生产服务器是实时的,我不想为我的用户"破坏"服务器.

在一个只调用phpinfo()的php页面上将当前vs new与以下命令进行比较: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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

现在,这不是一个真正的"公平"测试,因为除了基准测试之外,当前的服务器还在处理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)
Run Code Online (Sandbox Code Playgroud)

新服务器:

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)
Run Code Online (Sandbox Code Playgroud)

此测试正在加载Joomla CMS动态生成的页面.这是一个"真实世界"测试.再次,由于新服务器不处理当前网站流量,所以它不是苹果对苹果的比较.我不想更加努力地测试,否则我会冒最终用户在我的网站上的体验.

在将站点迁移到新服务器之后,我计划再次执行上述测试,以便查看常规站点流量对基准测试的影响.相同机器的生产与闲置基准测试结果相同.

现在,我也在考虑强调新服务器并确保其反应良好.运行命令ab -n 50000 -c 200我正在观看top命令并查看正在使用多少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
Run Code Online (Sandbox Code Playgroud)

请注意非常高的失败请求率.我的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
Run Code Online (Sandbox Code Playgroud)

这花费了两倍的时间,但失败的请求率要低得多.基本上,服务器现在配置为能够处理我的站点主页之一的至少200个同时页面视图,但是每页需要5秒才能为它们提供服务.不是很好,但比我以前得到的MySQL错误要好得多.

在所有这些期间,我的服务器CPU使用率固定为100%,"平均负载"徘徊在180以上.MySQL正在使用大约8-9%的CPU并且没有使用大量的RAM我已经分配了它因为我只是反复锤击同一页面,所以它只处理一个数据库.400MB的4GB +配置为成长为.top显示缓冲区和缓存的内存使用量,占可用RAM总量的50%左右.因此,当我使用此测试加载机器时,它没有接近超载点.在现实世界的数据库使用情况下,MySQL应该占用我分配的大部分内存,因此服务器应该非常接近满载.

我的下一个测试是测试apache在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
Run Code Online (Sandbox Code Playgroud)

这显示了与具有正确MySQL连接上限的200连接测试类似的结果.我觉得这对我好.我不喜欢返回页面的7秒钟,但我认为我可以通过在Joomla中使用APC或Memcache缓存来实现Joomla级别的缓存,这些缓存都已安装但尚未被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
Run Code Online (Sandbox Code Playgroud)

我不知道我对这些结果的解释是否"正确",或者我是否遗漏了一些有价值的东西,但由于缺乏我能找到的指导,这就是我想出来的.

我只是用结果来确保我得到了很好的响应率 - 缺乏完美的响应率让我感到担忧,但我不知道如何以我能检查它们的方式查看或重现故障.

每个请求的缓慢时间也让我感到担忧,但我认为我可以在应用层解决大部分问题.

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

在这些基准测试之后看一下像MonYog这样的其他性能调优工具也向我展示了我当前的配置"足够好".

我希望有一个地方人们发布了我可以用硬件描述和软件配置重现的测试结果,所以我知道我是否"有竞争力"或者我还有很多工作要做,以便最好地利用我的设备.因此,我发布结果的原因.

  • 我想你可能会错误解释失败的请求行,另见我的回答. (3认同)

ama*_*ion 9

请注意,对于"失败的请求"行,通过比较后续请求的长度来确定失败的请求.对于动态网站,这并不意味着请求完全失败!所以不要担心失败的请求行.

另见:http://www.celebrazio.net/tech/unix/apache_bench.html


hol*_*lli 6

在creuzerm回答之上.这是一个非常好的链接与更多的信息

https://serverfault.com/questions/274252/apache-ab-please-explain-the-output

关于更多关于线之间的差异

Time per request:       7.303 [ms] (mean)
Time per request:       0.730 [ms] (mean, across all concurrent requests)
Run Code Online (Sandbox Code Playgroud)