2018年10月13日 星期六

《面試官別再問》ApacheBench 網站壓力測試使用方法

ab是apache自帶的壓力測試工具。ab非常實用,它不僅可以對apache服務器進行網站訪問壓力測試,也可以對或其它類型的服務器進行壓力測試。比如nginx、tomcat、IIS等。

一、ab 的原理(apachebench命令的縮寫)

ab命令會創建多個並發訪問線程,模擬多個訪問者同時對某一URL地址進行訪問。它的測試目標是基於URL的,因此,它既可以用來測試apache的負載壓力,也可以測試nginx、lighthttp、tomcat、IIS等其它Web服務器的壓力

ab命令對發出負載的計算機要求很低,它既不會佔用很高CPU,也不會佔用很多內存。但卻會給目標服務器造成巨大的負載,其原理類似CC攻擊。自己測試使用也需要注意,否則一次上太多的負載。可能造成目標服務器資源耗完,嚴重時甚至導致當機

ApacheBench參數說明

格式:ab [options] [http://]hostname[:port]/path 
參數說明:
-n requests Number of requests to perform 
//在測試會話中所執行的請求個數(本次測試總共要訪問頁面的次數)。默認時,僅執行一個請求。
-c concurrency Number of multiple requests to make 
//一次產生的請求個數(同時訪問)。默認是一次一個。
-t timelimit Seconds to max. wait for responses 
//測試所進行的最大秒數。其內部隱含值是-n 50000。它可以使對服務器的測試限制在一個固定的總時間以內。默認時,沒有時間限制。
-p postfile File containing data to POST 
//包含了需要POST的數據的文件,文件格式如“p1=1&p2=2”.使用方法是-p 111.txt 。(配合-T)
-T content-type Content-type header for POSTing 
//POST數據所使用的Content-type頭信息,如-T “application/x-www-form-urlencoded” 。(配合-p)
-v verbosity How much troubleshooting info to print
//設置顯示信息的詳細程度– 4或更大值會顯示頭信息, 3或更大值可以顯示響應代碼(404, 200等), 2或更大值可以顯示警告和其他信息。-V顯示版本號並退出。
-w Print out results in HTML tables 
//以HTML表的格式輸出結果。默認時,它是白色背景的兩列寬度的一張表。
-i Use HEAD instead of GET 
//執行HEAD請求,而不是GET。
-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 
-C attribute Add cookie, eg. -C “c1=1234,c2=2,c3= 3” (repeatable) 
//-C cookie-name=value對請求附加一個Cookie:行。其典型形式是name=value的一個參數對。此參數可以重複,用逗號分割。
提示:可以藉助session實現原理傳遞JSESSIONID參數,實現保持會話的功能,如
-C ” c1=1234,c2=2,c3=3, JSESSIONID=FF056CD16DA9D71CB131C1D56F0319F8″ 。
-H attribute Add Arbitrary header line, eg. 'Accept-Encoding: gzip' Inserted after all normal header lines. (repeatable) 
-A attribute Add Basic WWW Authentication, the attributes 
are a colon separated username and password. 
-P attribute Add Basic Proxy Authentication, the attributes 
are a colon separated username and password. 
//-P proxy-auth-username:password對一個中轉代理提供BASIC認證信任。用戶名和密碼由一個:隔開,並以base64編碼形式發送。無論服務器是否需要(即,是否發送了401認證需求代碼),此字符串都會被發送。
-X proxy:port Proxyserver and port number to use 
-V Print version number and exit 
-k Use HTTP KeepAlive feature 
-d Do not show percentiles served table. 
-S Do not show confidence estimators and warnings.
-g filename Output collected data to gnuplot format file. 
-e filename Output CSV file with percentages served 
-h Display usage information (this message) 
//-attributes設置屬性的字符串.缺陷程序中有各種靜態聲明的固定長度的緩衝區。另外,對命令行參數、服務器的響應頭和其他外部輸入的解析也很簡單,這可能會有不良後果。它沒有完整地實現HTTP/1.x;僅接受某些'預想'的響應格式。strstr(3)的頻繁使用可能會帶來性能問題,即你可能是在測試ab而不是服務器的性能。
參數很多,一般我們用-c和-n參數就可以了。例如:
# ab -c 5000 -n 600 http://127.0.0.1/index.php


  • 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,即對於單個用戶而言,平均每個請求處理的時間。
  • 沒有留言:

    張貼留言

    熱門文章