簡介
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