﻿# 分享 ApacheBench 的壓力測試結果報告分析心得

這幾天一直在分析 ApacheBench 壓力測試的數據結果，由於對一些產出的數據在判讀上不是很有信心，而且網路上幾乎都沒有這方面的數據說明 (連英文的我都找不到)，所以特別[下載 httpd-2.2.14 的原始碼](http://httpd.apache.org/download.cgi)回來研究 ApacheBench 實際測試數據計算的方式，也特別將研究心得寫下來。

對於輸出的報表基本欄位的說明我已經在【[使用 ApacheBench 進行網站的壓力測試](/post/2008/06/30/Using-ApacheBench-ab-to-to-Web-stress-test)】有了詳細的解釋，今天主要是分析特定幾種統計數據的細節。

**1\. Connection Times (ms)   
    壓力測試時的各種處理時間**

![Connection Times (ms) ： 壓力測試時的各種處理時間](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/74fdfee903d301a4952d-image.png "Connection Times (ms) ： 壓力測試時的各種處理時間")

要瞭解以上欄位必須先知道 ApacheBench 處理每一個要求 (Request) 時的各種狀態定義，在我分析 ab 的原始碼後 ( C++ ) 發現一共有 5 種狀態，分別介紹如下：

1.  **start**            準備開始建立連線
2.  **connect**      已建立連線 ( 並進入等待狀態 )
3.  **endwrite**    已送出 HTTP Request 指令
4.  **beginread**  已收到 HTTP Response 的第一個 byte
5.  **done**          完成 HTTP 要求並中斷連線

所以我改用比較精確且工程師容易理解的描述一遍各欄位的計算方式如下：

-   **Connect**:      從 start 到 connect 所花費的時間
-   **Processing**:  從 connect 到 done 所花費的時間
-   **Waiting**:       從 endwrite 到 beginread 所花費的時間
-   **Total**:           從 start 到 done 所花費的時間

**2\. Percentage of the requests served within a certain time (ms)  
    當壓力測試執行到特定幾 % 的要求時，當下的 HTTP 要求所花費的時間**

![Percentage of the requests served within a certain time (ms)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/8b1dbe88ad7cf111d121-image.png "Percentage of the requests served within a certain time (ms)")

這部分是「取樣」(Sampling) 的效能數據，如上圖所示，我總共發出 1000 個 HTTP 要求，當所有 HTTP 要求發送到 50% 時（也就是第 500 個 HTTP 要求），在**那一次**的 HTTP 要求總共的 Total 時間 ( 也就是那一次 HTTP 要求從 start 到 done 所花費的時間 )。

以上圖為例，在第 50% 的那一個 HTTP 要求總共花費 478ms 完成，在 100% 也就是最後一個 HTTP要求總共花費 3.49 秒完成，最後的 longest request 意思是指「最晚的一次 HTTP 要求」，並非「最長的 HTTP 要求」，雖然數據看起來的確是最後一個 Request 最長，不過並不是這個意思。

在程式碼中有定義特定幾個百分比的數據會輸出到報表結果中，如下：

```
/* interesting percentiles */int percs[] = {50, 66, 75, 80, 90, 95, 98, 99, 100};
```

**3\. Output CSV file with percentages served.  
    輸出 CSV 檔的效能數據**

![Output CSV file with percentages served.](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/5fb0606bd5ccd68f90c5-image.png "Output CSV file with percentages served.")

在 ab.exe 的說明檔中 ( 可用 **ab –v** 顯示 Help 內容 )，其中有個 -e 參數可以指定效能數據要輸出的 [CSV](http://en.wikipedia.org/wiki/Comma-separated_values) 檔名，輸出的內容如下：

![ab.exe 中有個 -e 參數可以指定效能數據要輸出的 CSV 檔名，輸出的內容](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/b287d9475e398117c9db-image.png "ab.exe 中有個 -e 參數可以指定效能數據要輸出的 CSV 檔名，輸出的內容")

這裡的數據跟 **Percentage of the requests served within a certain time (ms)** 的數據一模一樣，也是取樣的數據，只是這裡提供 1% ~ 100% 比較完整的取樣資訊 ( 不過也還是「取樣」而已，並不完整 )。

這裡第一個欄位所顯示數字是從 0 ~ 99，事實上應該是 1% ~ 100% 才對。

**4\. Output collected data to gnuplot format file.  
    輸出每一個 HTTP 要求的完整數據資訊**

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/a6dfbb660a307255b0cf-image.png "image")

ab.exe 有個 -g 參數可以指定效能數據要輸出的 [TSV](http://en.wikipedia.org/wiki/Tab-separated_values) 檔名，輸出的內容如下：

![ab.exe 有個 -g 參數可以指定效能數據要輸出的 TSV 檔名，輸出的內容](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/26535c72ba63cb00fdca-image.png "ab.exe 有個 -g 參數可以指定效能數據要輸出的 TSV 檔名，輸出的內容")

這裡的數據就是「非常完整」的效能資訊了，你如果執行 20,000 個 HTTP Request ( –n 20000 ) 這裡就會有 20,000 筆資料，記錄你每一個 HTTP Request 的所有效能數據，欄位說明如下：

-   要求開始時間 (**starttime**)
-   要求開始時間 (**seconds**)   
    註: 這裡的秒數是從 1970/1/1 AM 00:00:00 到現在的秒數，也是 Unix 常用的 Timestamp 表示法
-   建立連線花費的時間 (**ctime**)
-   除了連線時間外所花費的時間 (**dtime**) (從 connect 到 done 所花費的時間)
-   完成這個要求所花費的總時間 (**ttime**)
-   等待時間 (**wait**) (從 endwrite 到 beginread 所花費的時間)

有了這些數據，就可以利用 Excel 計算出非常精細的效能分析報表，算是非常陽春但卻非常實用的工具，缺點就是什麼都要自己來，而且沒人教要看懂這些數據還真不容易。
