使用ab进行压力测试的时候可能会得到这样一个错误:

Complete requests:      100
Failed requests:        99
   (Connect: 0, Receive: 0, Length: 99, Exceptions: 0)
Keep-Alive requests:    0
Total transferred:      213113 bytes
HTML transferred:       211705 bytes

可以很明显看到所有的 Failed requests 都是 Length 这个类别的错误,但是进行排查的时候又发现所有的请求都是正常的。原因是受测网站的这个页面是动态的内容,当第一次发出 HTTP request 与后续发出的 HTTP request 所得到回应的 HTML的长度都是不同的,也就是每次返回的 Content-Length 不一致,就会导致 Failed requests 错误,因此这类 Length 失败在进行动态网页压力测试时是合理的,可以不予理会。

ab假设响应内容的长度在整个测试期间是相同的。它会保存第 1 次取得的 Content-Length,第二次以及以后的请求所返回的Content-Length 与第 1 次的长度不一致,就会导致出现 Length 的错误。

解决方案

在进行压力测试的时候加上选项 -l。这个选项允许ab接受可变文档长度。

Apache HTTP server benchmarking tool