负载testing与AB …假失败的请求(长度)

做一些负载testing,为了我自己的好奇心,在我的服务器上跑了:

ab -kc 50 -t 200 http://localhost/index.php 

这将打开50个保持连接状态200秒,然后用索引index.php请求我的服务器

在我的结果中,我得到:

 Concurrency Level: 50 Time taken for tests: 200.007 seconds Complete requests: 33106 Failed requests: 32951 (Connect: 0, Receive: 0, Length: 32951, Exceptions: 0) Write errors: 0 Keep-Alive requests: 0 Total transferred: 1948268960 bytes HTML transferred: 1938001392 bytes Requests per second: 165.52 [#/sec] (mean) Time per request: 302.071 [ms] (mean) Time per request: 6.041 [ms] (mean, across all concurrent requests) Transfer rate: 9512.69 [Kbytes/sec] received 

请注意32951“失败”请求。 我无法弄清楚这一点。

在testing运行时,我可以很好地从家用电脑访问我的网站,尽pipe页面底部的页面加载时间是.5而不是通常的.02。 不过,我从来没有失败的要求。

那么为什么AB报告有一半的连接失败? 在这种情况下,“长度”是什么意思?

谢谢

没关系。 “长度失败”仅仅表示答复时间的大约一半时间不同。

由于内容是dynamic的,可能是会话标识符或类似的东西。

换句话说,要说明这个问题:

apache基准testing工具(ab)假定在整个testing过程中响应内容的长度是相同的。 它存储第一个响应的内容长度。 如果任何进一步的响应具有不同的内容长度,则导致“长度失败”。

以下的Apache错误报告似乎证实: ASF错误42040

总结 :如果你正在服务任何可变长度的内容,你可能应该忽略这种ab请求失败。

编辑 :我最近注意到, ab命令有一个新的(至less对我来说)选项:

 -l Accept variable document length (use this for dynamic pages) 

我可以在版本2.3 <$ Revision:1528965 $>中看到它,但是在版本2.3 <$ Revision:655654 $>中看不到它,所以它可能是相对最近添加的。

抱歉要重新提出一个老问题,但这是第一个在Google上popup的问题。 有时,由ab报告的长度错误可能是由一个实际问题引起的:如果在Content-Length报头中声明的总字节数尚未被客户端接收之前,服务器端的连接被closures。 如果客户端和服务器之间还有其他方面的话,就会发生这种情况,例如,天真的手工制作的负载均衡器(我的情况)。