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

men發表於2020-07-26

簡介

ab命令會建立多個併發訪問執行緒,模擬多個訪問者同時對某一URL地址進行訪問。它的測試目標是基於URL的。

# 1.ab每次只能測試一個URL,適合做重複壓力測試
# 2.引數很多,可以支援新增cookie,啟用keeplive
# 3.可以將測試結果匯入檔案
# 4.設定顯示資訊的詳細程度

綜合來說,適合單個URL的測試,可以支援更多方式去測試,比如使用cookie模仿使用者提交表單來測試資料庫,但ab是單執行緒的,不適合測效能高的伺服器

安裝ab

需要安裝httpd-tools

yum -y install httpd-tools

使用案例

Example1
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不支援每秒訪問多少,所以寫一個指令碼

#!/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)記下來

# 一個
ab -n 100 -C key=value http://test.com/
# 多個賬號
ab -n 100 -H “Cookie: Key1=Value1; Key2=Value2” http://test.com/

具體引數

-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} / 請求大小

#(?G):表示記憶體大小
# 1024:表示記憶體容量標準進位制
# system:表示系統和服務佔用的額外記憶體和需要預留的記憶體
# 請求大小:表示靜態(一般為KB)或動態(一般為MB)的請求大小

# 16核32G伺服器,可以抗住4萬多用於負載均衡的併發,最多可以抗住5-6萬
簡單使用下ab壓測工具
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連線狀態
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]}'

返回結果一般如下

# LAST_ACK 5 (正在等待處理的請求數)
# SYN_RECV 30
# ESTABLISHED 1597 (正常資料傳輸狀態)
# FIN_WAIT1 51
# FIN_WAIT2 504
# TIME_WAIT 1057 (處理完畢,等待超時結束的請求數)

其他引數說明

# CLOSED:無連線是活動的或正在進行
# LISTEN:伺服器在等待進入呼叫
# SYN_RECV:一個連線請求已經到達,等待確認
# SYN_SENT:應用已經開始,開啟一個連線
# ESTABLISHED:正常資料傳輸狀態
# FIN_WAIT1:應用說它已經完成
# FIN_WAIT2:另一邊已同意釋放
# ITMED_WAIT:等待所有分組死掉
# CLOSING:兩邊同時嘗試關閉
# TIME_WAIT:另一邊已初始化一個釋放
# LAST_ACK:等待所有分組死掉
檢視Nginx和Apache的執行程式數
ps -ef | grep nginx | wc -l
ps -ef | grep httpd | wc -l
檢視Web伺服器程式連線數
netstat -antp | grep 80 | grep ESTABLISHED -c

相關文章