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

我最近在用 ab ( ApacheBench ) 測試一個網站時發現結果報告中一直會出現 Failed requests，而且出現的次數非常高，我原本以為是壓力測試的結果有大部分是失敗的，但看觀看其他數據卻一點也不覺得有失敗，經過一番研究後才真正理解為何會出現 Failed request 數據。

如下壓力測試的結果：

```
Server Software:        Microsoft-IIS/7.5Server Hostname:        example.comServer Port:            80Document Path:          /Document Length:        35137 bytesConcurrency Level:      1Time taken for tests:   4.619462 secondsComplete requests:      100Failed requests:        99   (Connect: 0, Length: 99, Exceptions: 0)Write errors:           0Keep-Alive requests:    100Total transferred:      3543782 bytesHTML transferred:       3507782 bytesRequests 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 的錯誤。

其他壓測結果欄位的說明可參考我另一篇文章：[使用 ApacheBench 進行網站的壓力測試](/post/2008/06/30/Using-ApacheBench-ab-to-to-Web-stress-test)

**相關連結**

-   [Web Server Performance Testing with Apache Bench](http://www.celebrazio.net/tech/unix/apache_bench.html)
-   [ApacheBench - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/ApacheBench)
-   [ab - Apache HTTP server benchmarking tool](http://httpd.apache.org/docs/2.2/programs/ab.html)
-   [mod\_perl: Performance Tuning](http://perl.apache.org/docs/1.0/guide/performance.html#ApacheBench)
