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