ab並發負載壓力測試


一、ab

0、安裝ab壓力測試軟件

[root@a2 conf]# yum install httpd-tools -y

#查看版本
[root@a2 conf]# ab -V
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

  

1、壓力測試的幾個概念:

吞吐率(Requests per second)
概念:服務器並發處理能力的量化描述,單位是reqs/s,指的是某個並發用戶數下單位時間內處理的請求數。某個並發用戶數下單位時間內能處理的最大請求數,稱之為最大吞吐率。
計算公式:總請求數 / 處理完成這些請求數所花費的時間,即
Request per second = Complete requests / Time taken for tests

並發連接數(The number of concurrent connections)
概念:某個時刻服務器所接受的請求數目,簡單的講,就是一個會話。

並發用戶數(The number of concurrent users,Concurrency Level)
概念:要注意區分這個概念和並發連接數之間的區別,一個用戶可能同時會產生多個會話,也即連接數。

用戶平均請求等待時間(Time per request)
計算公式:處理完成所有請求數所花費的時間/ (總請求數 / 並發用戶數),即
Time per request = Time taken for tests /( Complete requests / Concurrency Level)

服務器平均請求等待時間(Time per request: across all concurrent requests)
計算公式:處理完成所有請求數所花費的時間 / 總請求數,即
Time taken for / testsComplete requests
可以看到,它是吞吐率的倒數。
同時,它也=用戶平均請求等待時間/並發用戶數,即
Time per request / Concurrency Level

2、ab是apache自帶的壓力測試工具。

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

Apache的ab命令模擬多線程並發請求,測試服務器負載壓力,也可以測試nginx、lighthttp、IIS等其它Web服務器的壓力。 
ab命令對發出負載的計算機要求很低,既不會占用很多CPU,也不會占用太多的內存,但卻會給目標服務器造成巨大的負載,自己使用也須謹慎。否則一次上太多的負載,造成目標服務器直接因內存耗光死機,而不得不硬重啟,得不償失。

在帶寬不足的情況下,最好是本機進行測試,建議使用內網的另一台或者多台服務器通過內網進行測試,這樣得出的數據,准確度會高很多。遠程對web服務器進行壓力測試,往往效果不理想(因為網絡延時過大或帶寬不足)。

 ab軟件單機模擬: 0-20000 並發的能力。

 

3、ab的幫助

Options做下解釋吧:
-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特性。
-d不顯示百分比。
-S不顯示預估和警告信息。
-g輸出結果信息到gnuplot格式的文件中。
-e輸出結果信息到CSV格式的文件中。
-r指定接收到錯誤信息時不退出程序。
-h顯示用法信息,其實就是ab -help。

4、ab使用方法

壓測塊景設置: 
ab -n 800 -c 800  http://192.168.0.10/ 
(-n發出800個請求,-c模擬800並發,相當800人同時訪問,后面是測試url)

ab -t 60 -c 100 http://192.168.0.10/ 
在60秒內發請求,一次100個請求。 
  
//如果需要在url中帶參數,這樣做 
ab -t 60 -c 100 -T "text/plain" -p p.txt http://192.168.0.10/hello.html 

5、壓測記錄

#install software
yum install httpd-tools -y

#test nginx

[root@aikt-n1 vhosts]# ab -n 10000 -c 10000 https://nlu.gree.com/unisound/v1/query
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking nlu.gree.com (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software: nginx/1.8.0
Server Hostname: nlu.gree.com
Server Port: 443
SSL/TLS Protocol: TLSv1/SSLv3,ECDHE-RSA-AES256-GCM-SHA384,2048,256

Document Path: /unisound/v1/query
Document Length: 168 bytes       #HTTP響應數據的正文長度

Concurrency Level: 10000
Time taken for tests: 31.878 seconds   #所有這些請求處理完成所花費的時間 
Complete requests: 10000   # 完成請求數 
Failed requests: 0    #  失敗請求數 
Write errors: 0
Non-2xx responses: 10001
Total transferred: 3170317 bytes   #網絡總傳輸量
HTML transferred: 1680168 bytes    #HTML內容傳輸量 
Requests per second: 313.69 [#/sec] (mean)   #吞吐量-每秒請求數 
Time per request: 31878.099 [ms] (mean)    #服務器收到請求,響應頁面要花費的時間 
Time per request: 3.188 [ms] (mean, across all concurrent requests)  #並發的每個請求平均消耗時間 
Transfer rate: 97.12 [Kbytes/sec] received     #平均每秒網絡上的流量,可以幫助排除是否存在網絡流量過大導致響應時間延長的問題

 

#網絡上消耗的時間的分解: 

整個場景中所有請求的響應情況。在場景中每個請求都有一個響應時間 
其中 50% 的用戶響應時間小於 571 毫秒 
80 % 的用戶響應時間小於 652 毫秒 
最大的響應時間小於 684 毫秒 

Connection Times (ms)
min mean[+/-sd] median max
Connect: 7 28905 1349.2 28908 31192
Processing: 0 2630 1292.5 2632 4852
Waiting: 0 2622 1295.1 2621 4852
Total: 299 31535 326.5 31542 31582

Percentage of the requests served within a certain time (ms)
50% 31542
66% 31558
75% 31566
80% 31570
90% 31575
95% 31579
98% 31581
99% 31582
100% 31582 (longest request)

 

7、其它ab壓測過程中遇到的一些問題

#當使用ab做壓力測試,執行類似的命令:

1
ab -c 10 -n 10000 www.xxx.com/

提示apr_poll: The timeout specified has expired (70007)或者apr_socket_recv: Connection timed out (110)。

解決方法:添加-k參數,壓力測試命令改為“ab -c 10 -n 10000 -k www.xxx.com/”,如果問題依舊,那就得從linux服務器配置着手。向/etc/sysctl.conf配置文件添加下邊的設置,主要調整net.ipv4.netfilter.ip_conntrack_max或nf_conntrack_max的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#kernel2.6之前的內核版本添加如下配置:
net.ipv4.netfilter.ip_conntrack_max = 655360
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 1200
 
#kernel2.6之后的內核版本添加如下配置:
net.nf_conntrack_max = 655360
net.netfilter.nf_conntrack_tcp_timeout_established = 1200
 
net.ipv4.tcp_syncookies = 1  #當出現SYN等待隊列溢出時,啟用cookies來處理,可防范少量SYN攻擊,默認為0,表示關閉
net.ipv4.tcp_tw_recycle = 1  #開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉。
net.ipv4.tcp_tw_reuse = 1  #開啟重用,將TIME-WAIT sockets重新用於新的TCP連接,默認為0,表示關閉;
net.ipv4.tcp_fin_timeout = 25  #修改系統默認的 TIMEOUT 時間
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_max_orphans = 8192
net.ipv4.ip_local_port_range = 32768 61000
1
sysctl -p  /etc/sysctl .conf  #不重起服務器,讓新配置生效

2)在用ab測試的時候,只要出現Failed requests(失敗的請求),就會出現三種失敗的類型統計:Connect、Length、Exception。

Connect:向服務器發送請求失敗;服務器連接失敗;請求過程連接中斷等。

Length:服務器返回的數據長度不一致,一般是對比Content-Length的值。

Exception:與服務器連接過程中發生意外錯誤。

這里主要說明一下Length,ab會把第一次成功返回的content-length作為基准,如果后面的請求返回的content-length跟第一次的不一樣,它就會把這次請求當成是失敗了。對於動態類型的網站,每次服務器返回的數據都不一定相同,所以如果ab提示的是Length錯誤,基本都可以忽略掉。

3)默認情況下,ab沒有啟用gzip壓縮功能,所以壓力測試的結果會跟實際情況有很大的偏差。要想讓ab使用gzip壓縮功能,得添加參數 -H 'Accept-Encoding: gzip'

1
ab -H  'Accept-Encoding: gzip'  www.xxx.com/

4)帶參數的壓力測試示例

1
ab  'www.xxx.com/?a=1&b=2&c=3'

5)提示:Benchmarking 127.0.0.1 (be patient)... 使用了與請求的協議不兼容的地址(730047)

如果出現這個問題,那很可能是你使用了apache2.4.1或以上的版本。似乎從2.4.*開始,就使用了ipv6的協議,另一種角度來說,這可能是一個bug,所以檢測一下是不是以前把ipv6的相關服務給關了。開始菜單->控制面板->任務管理器->服務->啟用IP Helper。

再檢查一下文件C:\Windows\System32\drivers\etc\hosts,添加下邊的對應關系。

1
::1             localhost

::1是ipv6中的IP地址,ipv4為127.0.0.1。

如果真是版本缺陷,我還是建議更換低版本的ab來使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM