在阿帕契服務器的套件中,有一個叫做 ab (ApacheBench) 的工具。ApacheBench 主要是用來測試阿帕契服務器執行效率用的,我們就以 ApacheBench 做為 CGI vs. FastCGI 的評比工具。
ApacheBench 可以針對某個特定的 URL 仿真出連續的聯機請求,同時還可以仿真出同時間點數個相同的聯機請求,因此利用 ApacheBench 可幫助我們在網站開發期間仿真實際上線可能的情況,利用仿真出來的數據做為調整服務器設定或程序的依據。 ApacheBench 的用法如下:
Usage: /usr/local/apache/bin/ab [options] [http://]hostname[:port]/path
Options are:
-n requests Number of requests to perform
-c concurrency Number of multiple requests to make
-t timelimit Seconds to max. wait for responses
-p postfile File containg data to POST
-T content-type Content-type header for POSTing
-v verbosity How much troubleshooting info to print
-w Print out results in HTML tables
-x attributes String to insert as table attributes
-y attributes String to insert as tr attributes
-z attributes String to insert as td or th attributes
-V Print version number and exit
-k Use HTTP KeepAlive feature
-h Display usage information (this message)
而我經常使用的參數摘要如下:
1. 同時 20 個連線,連續點擊 1000 次 ( 每個 Request 執行完畢後都會自動斷線,然後再重新連線 )
引用:
ab -n 1000 -c 20 http://www.example.com/index.php
2. 同時 20 個連線,連續點擊 1000 次,並且使用 Keep-Alive 方式連線
(當 Web Server 有支援 Keep-Alive 功能時 ApacheBench 會在同一個連線下連續點擊該網頁)
引用:
ab -n 1000 -c 20 -k http://www.example.com/index.php
3. 將測試的效能原始資料匯出成 CSV 檔
引用:
ab -e output.csv -n 1000 -c 20 http://www.example.com/index.php
如何有效的檢視結果
壓力測試的核心在於如何分析結果,底下我用一個測試的結果說明每個欄位所代表的意義。如果你只要看重點的話,可以看 Failed requests、Requests per second、與 Time per request 這三個參數也就差不多夠了。
其中的 Failed requests 的數量太高的話,很有可能代表你的 Web Application 的穩定度不夠,而導致使用大量要求時無法回應需求 。
而 Request per second 代表你每表可送出的回應數有多少,代表你 Web Application 的承載量有多少(在不考慮頻寬限制的情況下)。
引用:
Server Software: Apache/2.2.25
Server Hostname: www.adj.idv.tw
Server Port: 80
Document Path: /
Document Length: 0 bytes
Concurrency Level: 20
Time taken for tests: 6.585 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Non-2xx responses: 1000
Total transferred: 277000 bytes
HTML transferred: 0 bytes
Requests per second: 151.86 [#/sec] (mean)
Time per request: 131.702 [ms] (mean)
Time per request: 6.585 [ms] (mean, across all concurrent requests)
Transfer rate: 41.08 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 59 60 0.5 60 66
Processing: 67 70 13.6 69 445
Waiting: 67 70 13.6 69 445
Total: 126 131 13.7 129 504
Percentage of the requests served within a certain time (ms)
50% 129
66% 130
75% 130
80% 131
90% 132
95% 133
98% 140
99% 151
100% 504 (longest request)
如上表顯示的結果來說明,我一個欄位一個欄位的講解如下:
Server Software: Web主機的作業系統與版本(若Web主機設定關閉此資訊則無)
Server Hostname: Web主機的IP位址(Hostname)
Server Port: Web主機的連接埠(Port)
Document Path: 測試網址的路徑部分
Document Length: 測試網頁回應的網頁大小
Concurrency Level: 同時進行壓力測試的人數
Time taken for tests: 本次壓力測試所花費的總秒數
Complete requests: 完成的要求數(Requests)
Failed requests: 失敗的要求數(Requests)
Write errors: 寫入失敗的數量
Total transferred: 本次壓力測試的總數據傳輸量(包括 HTTP Header 的資料也計算在內)
HTML transferred: 本次壓力測試的總數據傳輸量(僅計算回傳的 HTML 的資料)
Requests per second: 平均每秒可回應多少要求
Time per request: 平均每個要求所花費的時間(單位: 豪秒)
Time per request: 平均每個要求所花費的時間,跨所有同時連線數的平均值(單位: 豪秒)
Transfer rate: 從 ab 到 Web Server 之間的網路傳輸速度
參考文章:
http://blog.miniasp.com/post/2008/06/Using-ApacheBench-ab-to-to-Web-stress-test.aspx