我如何解释Apache的ab基准testing工具的结果?

好吧,我到处search,似乎无法find详细的资源在线如何解释来自Apache的ab服务器基准testing工具的结果。 我已经运行了几个我认为是截然不同的参数的testing,但看到了非常相似的结果(我很难想象这意味着我的网站是完美的扩展!)。 如果有人可以指点我的详细资源,如何理解这个testing的结果,或者如果有人想在这里创build一个,我认为这对我和其他人是非常有用的。

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

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

我需要并肩比较“打好”,因为生产服务器是现场的,我不想为我的用户“破坏”服务器。

在一个刚刚调用phpinfo()的php页面上比较当前和新的命令: 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在新的服务器上完成了所有testing的一半时间内的以下内容:

 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) 

现在,这不是一个“公平”的testing,因为除了基准testing之外,当前的服务器正在处理20个网站。 另外,它只是testingApache和PHP。

对我的一个更复杂的主页进行相同的testing,在当前服务器上感觉很慢,我看到以下内容:当前服务器:

 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) 

这个testing是加载一个Joomla CMSdynamic生成的页面。 这是一个更“真实世界”的testing。 再次,新的服务器不处理当前的网站stream量,所以它不是苹果比较。 我不想testing更难,或者我冒着我的最终用户在我的网站上的经验。

在将网站迁移到新服务器之后,我打算再次进行上述testing,以便我可以看到我的常规网站stream量对基准testing有什么影响。 同样的机器生产与闲置的基准testing结果。

现在,我也在强调新的服务器,并确保它的反应良好。 运行命令ab -n 50000 -c 200我正在看顶部命令,看看有多lessCPU和内存正在使用,同时在浏览器中查看页面是否出现错误,以及是否感觉到服务器响应需要多长时间。

我的第一个考验给了我:

 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,所以这是一个很好的testing – 我已经确定了一个需要的改变,并且意外地做了一个经验testing来validation这个改变必要性)。

下一次运行给了我以下结果:

 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 

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

在所有这一切中,我的服务器CPU使用率达到了100%,“负载平均值”徘徊在180以上.MySQL使用了大约8-9%的CPU,并没有使用我分配的大部分内存,因为我只是反复锤击相同的页面,所以它只处理一个单一的数据库。 400MB的4GB +configuration成长。 顶部显示caching和caching的内存使用率约占总可用内存的50%。 所以,当我用这个testing加载机器时,它并没有接近超载点。 在真实世界的数据库使用情况下,MySQL应该抓住我分配的大部分内存,所以服务器应该非常接近满负荷。

我的下一个testing是在250个连接ab -n 50000 -c 250的“满载”下testingapache

 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 

这是显示类似的结果,以200连接testing与适当的MySQL连接上限。 我觉得这对我很好。 我不喜欢7秒钟返回一个页面,但我想我可以通过在Joomla中cachingJoomla中的caching或使用Joomla中已安装但尚未使用的Memcache来改善。

试图推动我的运气,我想我会尝试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 

我不知道我对这些结果的解释是“正确的”,还是我错过了一些有价值的东西,但是由于缺乏我能find的指导,这就是我想出来的。

我只是用结果来确保我得到了很好的答复率 – 缺乏完美的答复率关系到我,但我不知道如何看待或重现失败的方式,我可以检查他们。

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

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

在这些基准testing之后,看看像MonYog这样的其他性能调整工具,也显示出我目前的configuration“足够好”。

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

请注意,对于“失败的请求”行,通过比较后续请求的长度来确定失败的请求。 对于dynamic网站,这并不意味着请求失败! 所以不要担心失败的请求行。

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

在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) 

在一个侧面说明,AB是单线程的(这对于2001年的Pentium 4等旧的单核CPU是可以的)。

要testing托pipeWeb服务器的多核CPU(使用多个进程的Nginx / Lighty,使用多个线程的Apache),您应该使用Weighttp(与AB兼容)。

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

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

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

第一个与每个并发用户请求的平均时间有关,所以如果你对1000个请求和200个并发用户进行testing,第一个是每个200请求的平均时间。 第二个涉及整个请求时间,这是整个1000个请求的平均时间