The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

對於 ApacheBench 進行測試時出現的 Failed requests 詳解

我最近在用 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 requestsLength 問題的失敗,因此這類 Length 不一致的失敗在進行「動態網頁」壓力測試時是合理的,可以不予理會。

這裡的 Length 是以 "第 1 次" 取得的 Content-Length 為主,如果第 2 次以後的 HTTP Request 所得到的 HTTP Response Header 得到的 Content-Length 與第 1 次取得的長度不一致,就會得到 Length 的錯誤。

其他壓測結果欄位的說明可參考我另一篇文章:使用 ApacheBench 進行網站的壓力測試

相關連結