为了做一些负载测试,出于我自己的好奇心,我在我的服务器上运行:

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

这会在200秒内打开50个keep-alive连接,并向服务器发送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个“失败”请求。我想不出来。

当测试运行时,我可以从家里的电脑完美地访问我的网站,尽管页面底部的页面加载时间报告为0.5,而不是通常的0.02。然而,我从未遇到过失败的请求。

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


别介意。“长度失败”仅仅表明大约有一半的时间响应的长度是不同的。

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


用另一句话来描述这个问题:

apache基准测试工具(ab)假设整个测试期间响应内容的长度是相同的。它存储第一个响应的内容长度。如果任何进一步的响应具有不同的内容长度,则会导致“长度失败”。

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

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

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

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

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


很抱歉要重新提出一个老问题,但这是谷歌中出现的第一个问题。有时ab报告的长度错误可能是由实际问题引起的:如果在Content-Length报头中声明的字节总数尚未被客户端接收之前,服务器端关闭了连接。如果客户端和服务器之间有其他方,例如,简单的手工负载平衡器(我的例子),就会发生这种情况。