1. 程式人生 > >使用AB對Nginx壓測和併發預估

使用AB對Nginx壓測和併發預估

#### 簡介 > ab命令會建立多個併發訪問執行緒,模擬多個訪問者同時對某一URL地址進行訪問。它的測試目標是基於URL的。 ```python # 1.ab每次只能測試一個URL,適合做重複壓力測試 # 2.引數很多,可以支援新增cookie,啟用keeplive # 3.可以將測試結果匯入檔案 # 4.設定顯示資訊的詳細程度 ``` `綜合來說,適合單個URL的測試,可以支援更多方式去測試,比如使用cookie模仿使用者提交表單來測試資料庫,但ab是單執行緒的,不適合測效能高的伺服器` #### 安裝ab > 需要安裝httpd-tools ```python yum -y install httpd-tools ``` #### 使用案例 ##### Example1 ```python ab -c 1000 -n 10000 http://192.168.2.38/ # -c指定1000併發,-n指定總10000次,相當於1000個人訪問10次。 # -k 是否開啟長連線 Server Software: nginx/1.8.1 #伺服器資訊和版本 Server Hostname: 192.168.2.38 #伺服器的域名 Server Port: 80 #埠 Document Path: / #訪問的路徑 Document Length: 612 bytes #文件的大小為 612 bytes(此為http響應的正文長度) Concurrency Level: 1000 #併發請求數 Time taken for tests: 0.287 seconds #整個測試持續的時間,預設秒 Complete requests: 1000 #完成的請求數 Failed requests: 0 #失敗的請求書 Write errors: 0 #網路連線寫入錯誤數 Total transferred: 844000 bytes #傳輸的總資料量 HTML transferred: 612000 bytes #傳輸的HTML內容傳輸量 Requests per second: 3485.11 [#/sec] (mean) #平均每秒請求數 Time per request: 286.935 [ms] (mean) #所有使用者都請求一次的平均時間 Time per request: 0.287 [ms] (mean, across all concurrent requests) #單個使用者請求一次的時間 Transfer rate: 2872.49 [Kbytes/sec] received #傳輸速率 Connection Times (ms) min mean[+/-sd] median max Connect: 0 84 4.1 84 94 Processing: 86 99 6.6 100 109 Waiting: 0 83 16.2 84 108 Total: 95 183 7.4 182 195 #所有服務請求的百分比佔用時間,這裡50%的請求用時182ms,一般看90%的部分 Percentage of the requests served within a certain time (ms) 50% 182 66% 188 75% 191 80% 192 90% 193 95% 194 98% 194 99% 194 100% 195 (longest request) ``` `接下來是每秒訪問,因為ab不支援每秒訪問多少,所以寫一個指令碼` ```python #!/bin/bash #當下是執行60秒,每秒1000併發,可以觀察伺服器負載 for i in `seq 1 60` do ab -c 1000 -n 1000 http://192.168.2.38/ & sleep 1 done ``` ##### Example2(使用cookie模擬多使用者) > 1.使用cookie來模擬多個使用者訪問 > 先用賬戶和密碼登入後,用開發者工具找到標識這個會話的Cookie值(Session ID)記下來 ```python # 一個 ab -n 100 -C key=value http://test.com/ # 多個賬號 ab -n 100 -H “Cookie: Key1=Value1; Key2=Value2” http://test.com/ ``` `具體引數` ```python -n 即requests,用於指定壓力測試總共的執行次數。 -c 即concurrency,用於指定壓力測試的併發數。 -t 即timelimit,等待響應的最大時間(單位:秒)。 -b 即windowsize,TCP傳送/接收的緩衝大小(單位:位元組)。 -p 即postfile,傳送POST請求時需要上傳的檔案,此外還必須設定-T引數。 -u 即putfile,傳送PUT請求時需要上傳的檔案,此外還必須設定-T引數。 -T 即content-type,用於設定Content-Type請求頭資訊,例如:application/x-www-form -urlencoded,預設值為text/plain。 -v 即verbosity,指定列印幫助資訊的冗餘級別。 -w 以HTML表格形式列印結果。 -i 使用HEAD請求代替GET請求。 -x 插入字串作為table標籤的屬性。 -y 插入字串作為tr標籤的屬性。 -z 插入字串作為td標籤的屬性。 -C 新增cookie資訊,例如:"Apache=1234"(可以重複該引數選項以新增多個)。 -H 新增任意的請求頭,例如:"Accept-Encoding: gzip",請求頭將會新增在現有的多個請求頭之後(可以重複該引數選項以新增多個)。 -A 新增一個基本的網路認證資訊,使用者名稱和密碼之間用英文冒號隔開。 -P 新增一個基本的代理認證資訊,使用者名稱和密碼之間用英文冒號隔開。 -X 指定使用的代理伺服器和埠號,例如:"126.10.10.3:88"。 -V 列印版本號並退出。 -k 使用HTTP的KeepAlive特性。 -k 使用HTTP的KeepAlive特性。 -d 不顯示百分比。 -S 不顯示預估和警告資訊。 -g 輸出結果資訊到gnuplot格式的檔案中。 -e 輸出結果資訊到CSV格式的檔案中。 -r 指定接收到錯誤資訊時不退出程式。 -h 顯示用法資訊,其實就是ab -help。 ``` #### Nginx壓測和併發預估 `預估演算法: { (?G) * 1024 - system} / 請求大小` ```python #(?G):表示記憶體大小 # 1024:表示記憶體容量標準進位制 # system:表示系統和服務佔用的額外記憶體和需要預留的記憶體 # 請求大小:表示靜態(一般為KB)或動態(一般為MB)的請求大小 # 16核32G伺服器,可以抗住4萬多用於負載均衡的併發,最多可以抗住5-6萬 ``` ##### 簡單使用下ab壓測工具 ```python ab -n2000 -c2 http://127.0.0.1/index.html # -n 總的請求次數 # -c 併發請求數 # -k 是否開啟長連線 Server Software: nginx/1.12.2 Server Hostname: 127.0.0.1 Server Port: 80 Document Path: /index.html Document Length: 19 bytes Concurrency Level: 200 # 總花費總時長 Time taken for tests: 1.013 seconds # 總請求數 Complete requests: 2000 # 請求失敗數 Failed requests: 0 Write errors: 0 Total transferred: 510000 bytes HTML transferred: 38000 bytes # 每秒多少請求/s(總請求出/總共完成的時間) Requests per second: 9333.23 [#/sec] (mean) # 客戶端訪問服務端, 單個請求所需花費的時間 Time per request: 101.315 [ms] (mean) # 服務端處理請求的時間 Time per request: 0.507 [ms] (mean, across all concurrent requests) # 判斷網路傳輸速率, 觀察網路是否存在瓶頸 Transfer rate: 491.58 [Kbytes/sec] received ``` ##### 檢視併發連線數和連線狀態 ##### 檢視Web伺服器(Nginx Apache)的併發請求數及其TCP連線狀態 ```python netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"t",state[key]}' ``` `返回結果一般如下` ```python # LAST_ACK 5 (正在等待處理的請求數) # SYN_RECV 30 # ESTABLISHED 1597 (正常資料傳輸狀態) # FIN_WAIT1 51 # FIN_WAIT2 504 # TIME_WAIT 1057 (處理完畢,等待超時結束的請求數) ``` `其他引數說明` ```python # CLOSED:無連線是活動的或正在進行 # LISTEN:伺服器在等待進入呼叫 # SYN_RECV:一個連線請求已經到達,等待確認 # SYN_SENT:應用已經開始,開啟一個連線 # ESTABLISHED:正常資料傳輸狀態 # FIN_WAIT1:應用說它已經完成 # FIN_WAIT2:另一邊已同意釋放 # ITMED_WAIT:等待所有分組死掉 # CLOSING:兩邊同時嘗試關閉 # TIME_WAIT:另一邊已初始化一個釋放 # LAST_ACK:等待所有分組死掉 ``` ##### 檢視Nginx和Apache的執行程序數 ```python ps -ef | grep nginx | wc -l ps -ef | grep httpd | wc -l ``` ##### 檢視Web伺服器程序連線數 ```python netstat -antp | grep 80 | grep ESTABLISHED