为了我自己的好奇心做一些负载测试,在我的服务器上运行:
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"失败"请求.我无法弄清楚这一点.
在测试运行时,我能够完美地从家用计算机访问我的网站,尽管页面底部的页面加载时间报告为.5而不是通常的.02.但是我从来没有遇到过失败的请求.
那么为什么AB报告说有一半的连接失败了?"长度:"在这种情况下意味着什么?
谢谢
没关系."长度失败"仅表示响应长度的大约一半时间不同.
由于内容是动态的,它可能是会话标识符或类似的东西.
换句话说来描述这个问题:
apache基准测试工具(ab)假设响应内容的长度在整个测试期间是相同的.它存储第一个响应的内容长度.如果任何进一步的响应具有不同的内容长度,则它们导致"长度失败".
以下apache bug报告似乎证实:ASF Bug 42040
简介:如果您要提供任何可变长度的内容,您应该忽略这种ab请求失败.
编辑:我最近注意到该ab
命令有一个新的(至少对我来说)选项:
-l Accept variable document length (use this for dynamic pages)
我可以在版本2.3 <$ Revision:1528965 $>中看到它,但在版本2.3 <$ Revision:655654 $>中看不到它,所以它可能是相对最近添加的.
很抱歉重新提出一个旧问题,但它是第一个出现在Google中的问题.有时ab报告的长度错误可能是由一个真正的问题引起的:如果连接在服务器端关闭,则客户端尚未收到Content-Length头中声明的总字节数.如果客户端和服务器之间存在其他方,例如,天真的手工负载平衡器(我的情况),就会发生这种情况.