我最近在用 ab ( ApacheBench ) 测试一个网站时发现结果报告中一直会出现 Failed requests,而且出现的次数非常高,我原本以为是压力测试的结果有大部分是失败的,但看观看其他数据却一点也不觉得有失败,经过一番研究后才真正理解为何会出现 Failed request 数据。
如下压力测试的结果:
-
Server Software: Microsoft-IIS/7.5
-
Server Hostname: example.com
-
Server Port: 80
-
Document Path: /
-
Document Length: 35137 bytes
-
Concurrency Level: 1
-
Time taken for tests: 4.619462 seconds
-
Complete requests: 100
-
Failed requests: 99
-
(Connect: 0, Length: 99, Exceptions: 0)
-
Write errors: 0
-
Keep-Alive requests: 100
-
Total transferred: 3543782 bytes
-
HTML transferred: 3507782 bytes
-
Requests per second: 21.65 [#/sec] (mean)
-
Time per request: 46.195 [ms] (mean)
-
Time per request: 46.195 [ms] (mean, across all concurrent requests)
-
Transfer rate: 749.00 [Kbytes/sec] received
先分析上述数据,我取得的第一份 HTML 文件得到的大小 ( Document Length ) 为 35,137 bytes,我总共发出要求共 100 次 ( Complete requests ),总 HTML 数据传输量 ( HTML transferred ) 为 3,507,782 bytes 感觉非常合理,实际的传输量大约是单一文件的 100 倍,所以我研判这 100 个 Request 的确有正确送出,但为何 Failed requests 会出现有 99 次的错误呢?
只要出现 Failed requests 就会多出现一行要求失败的各原因的数据统计,分别有 Connect, Length, 与 Exception 三种,分别代表的意义为:
Connect 无法送出要求、目标主机连接失败、要求的过程中连线被中断
Length 回应的内容长度不一致 ( 以 Content-Length 标头值为判断依据 )
Exception 发生无法预期的错误
而从上述说明就可以很明显看出所有的 Failed requests 都落在 Length 这个类别上,原来这是因为受测网站的首页是动态的内容,当第一次发出 HTTP request 与后续发出的 HTTP request 所得到回应的 HTML 长度都是不同大小的 ( 每次回应的 Content-Length 大小不一致 ),才会引发 Failed requests 的 Length 问题的失败,因此这类 Length 不一致的失败在进行「动态网页」压力测试时是合理的,可以不予理会。
这裡的 Length 是以 "第 1 次" 取得的 Content-Length 为主,如果第 2 次以后的 HTTP Request 所得到的 HTTP Response Header 得到的 Content-Length 与第 1 次取得的长度不一致,就会得到 Length 的错误。