ab併發負載壓力測試

1、abhtml

0、安裝ab壓力測試軟件linux

[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/

  

一、壓力測試的幾個概念:nginx

吞吐率(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

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

ab很是實用,它不只能夠對apache服務器進行網站訪問壓力測試,也能夠對或其它類型的服務器進行壓力測試。好比nginx、tomcat、IIS等。apache

Apache的ab命令模擬多線程併發請求,測試服務器負載壓力,也能夠測試nginx、lighthttp、IIS等其它Web服務器的壓力。 
ab命令對發出負載的計算機要求很低,既不會佔用不少CPU,也不會佔用太多的內存,但卻會給目標服務器形成巨大的負載,本身使用也須謹慎。不然一次上太多的負載,形成目標服務器直接因內存耗光死機,而不得不硬重啓,得不償失。windows

在帶寬不足的狀況下,最好是本機進行測試,建議使用內網的另外一臺或者多臺服務器經過內網進行測試,這樣得出的數據,準確度會高不少。遠程對web服務器進行壓力測試,每每效果不理想(由於網絡延時過大或帶寬不足)。tomcat

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

 

三、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。

四、ab使用方法cookie

壓測塊景設置: 
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 

五、壓測記錄

#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)

 

七、其它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來使用。

相關文章
相關標籤/搜索