ab引數詳解 – 壓力測試
Apache附帶的ab,它非常容易使用,ab可以直接在Web伺服器本地發起測試請求。這至關重要,因為我們希望測試的伺服器的處理時間,而不包含資料的網路傳輸時間以及使用者PC本地的計算時間。
需要清楚的是,ab進行一切測試的本質都是基於HTTP,所以可以說它是對於Web伺服器軟體的黑盒效能測試,它獲得的一切資料和計算結果,都可以通過HTTP來解釋。
另有一些壓力測試軟體,包括LoadRnner、Jmeter等,則是不同程度上包含了伺服器處理之外的時間,比如LoadRunner執行在使用者PC上,可以錄製瀏覽器行為,這種測試的結果玩玩側重於站點使用者的角度,有另外一些層面的參考意義。
接下來,將使用ab來進行一次壓力測試,在本書中我們使用Apache 2.3中附帶的ab,其版本資訊如下所示:
請看下面的命令列資訊:
請注意我們在啟動ab時,傳入3個命令列引數,它們正是代表了前面提到的前提條件:
-n1000 表示總請求數位1000
-c 表示併發使用者數為10
http://localhost/index.html 表示這些請求的目標URL。
測試結果一目瞭然,我們看到吞吐率顯示為2204.64reqs/s。同時,在測試結果中還有一些其他內容也值得我們關注,主要包括:
Server Software
表示被測試的Web伺服器軟體名稱,這裡是Apache/2.2.19,它來自於http響應資料的頭資訊,所以如果是我們自己編寫的Web伺服器軟或者修改開源Web伺服器軟體的原始碼,便可以隨意改寫這裡的名稱。
vi /usr/local/apache/conf/httpd.conf #隱藏具體版本資訊
ServerSignature Off
ServerTokens Prod
Server Hostname
表示請求的URL中的主機部分名稱,它來自於http請求資料的頭資訊,這裡我們請求的URL是http://localhost/index.html,所以主機名為localhost,說明我們的請求是從Web伺服器端發起的。
Server Port
表示被測試的Web伺服器軟體的監聽埠,為了方便測試,我們後面會對多個不同的Web伺服器軟體使用不同的監聽埠。
Document Path
表示請求的URL中根絕對路徑,它同樣來自於http請求資料的頭資訊,通過它的字尾名,我們一般可以理解該請求的型別。
Document Length
表示http響應資料的正文長度。
Concurrency Level
表示併發使用者數,這是我們設定的引數。
Time taken for tests
表示所有這些請求被處理完成花費的總時間。順便提一下,某些Apache版本如2.2.4附帶的ab,對於這一統計項存在一些計算上的bug,當總請求數較少時,其統計的總時間會無法小於0.1s。
Complete requests
表示總請求數,這是我們設定的相應引數。
Failed requests
表示失敗的請求數,這裡的失敗是指請求的連線伺服器、傳送資料、接收資料等環節發生異常,以及無響應後超時的情況。對於超時時間的設定可以用ab的-t引數。
而如果接受到的http響應資料的頭資訊中含有2xx以外的狀態碼,則會在測試結果顯示另一個名為“Non-2xx responses”的統計項,用於統計這部分請求數,這些請求並不算是失敗的請求。
Total transferred
表示所有請求的響應資料長度總和,包括每個http響應資料的頭資訊和正文資料的長度。注意這裡不包括http請求資料的長度,所以Total
transferred代表了從Web伺服器流向使用者PC的應用層資料總長度。通過使用ab的-v引數即可檢視詳細的http頭資訊。
HTML transferred
表示所有請求的響應資料中正文資料的總和,也就是減去了Total transferred中http響應資料中頭資訊的長度。
Requests per second
這便是我們重點關注的吞吐率,它等於:
Complete requests / Time taken for tests
Time per request
這便是前面提到的使用者平均請求等待時間,它等於:
Time taken for tests / (Complete requests /Concurrency Level)
Time per request?(across all concurrent requests)
這便是前面提到的伺服器平均請求處理時間,它等於:
Time taken for tests / Complete requests
這正是吞吐率的倒數。同時,它也等於:
Time per request / Concurrency Level
Transfer rate
表示這些請求在單位時間內從伺服器獲取的資料長度,它等於:
Total transferred / Time taken for tests
這個統計項可以很好的說明伺服器在處理能力達到限制時,其出口頻寬的需求量。
利用前面介紹的有關頻寬的知識,不難計算出結果。
Percentage of the requests served within a certain time(ms)
這部分資料用於描述每個請求處理時間的分佈情況,比如在以上測試結果中,80%請求的處理時間都不超過1ms,而99%的請求都不超過2ms。注意這裡的處理時間,是指前面的Time per request,即對於單個使用者而言,平均每個請求處理的時間。
繼續壓力測試
下面,我們再來進行一次壓力測試,此時併發使用者數為100,其他條件不變,測試結果如下所示: