利用autobench測試web服務器極限併發數

轉自:http://zhumeng8337797.blog.163.com/blog/static/10076891420121610439379/


一、目的

利用autobench工具結合httperf命令對web服務器進行測試,得出該服務器可以承載的最大併發連接數與最佳併發數。
二、測試工具
工具介紹
1、Httperf

httperf 是一款高性能的HTTP測試工具,使用它我們可以準確定位服務器的併發連接能力。下面介紹一下它的主要特徵

(1) 可以觀察測試客戶端(並非被測服務器)在發起壓力測試時的負載情況。這樣在測試高併發的情況下可以準確的分析問題。(被測服務器無法承載高併發還是測試客戶端無法發起過多請求)
(2)支持HTTP/1.1和SSL
(3)可以生成可擴展的測試計劃

下載:http://code.google.com/p/httperf/downloads/list

安裝:
# tar xvzf httperf-0.9.0.tar.gz
# cd httperf-0.9.0
#./configure
# make && make install

更多的使用方法參見man page。
2、autobench

autobench 是一款基於httperf的Perl腳本。它會在一次測試中調用多次httperf來對web服務器進行測試,每次會按照給定的參數增加併發連接數,將 httperf的測試結果保存爲CSV格式的文件,該文件可以被Excel直接讀取,方便生成測試報告。藉助於autobench自帶的 bench2graph工具可以生成漂亮的測試結果對比圖,如下:

下載:http://www.xenoclast.org/autobench/downloads/

安裝:

# yum install gd gnuplot pcre pcre-devel texinfo -y
# tar zxvf autobench-2.1.2.tar.gz
# cd autobench-2.1.2
# make && make install
# sed -i 's/postscript color/png xffffff/g' /usr/local/bin/bench2graph (修改bench2graph腳本,否則生成的圖像背景有問題)

使用方法:參見下文在實際測試中的使用
三、測試環境

系統環境
CentOS 5.6 64bit

web軟件環境
httpd-2.0.6
php5.2.6+ eAccelerator
php-fpm 開啓20個php-cgi進程
nginx-0.7.67

在測服務器併發能力時會將apache與nginx對比測試

硬件環境

CPU::E5504 2.00GHz
內存:1G
虛擬機環境

四、測試方法

1、 分別測試靜態文件和動態php文件
2、 靜態併發數從50開始,1500結束,增長幅度爲50,動態5~100,增幅爲5
3、 分別測試apache和nginx的併發能力,二者進行對比
4、 每次測試進行3次,最終結果求三次平均值
5、 每進行一次測試後均重啓httpd或nginx(php-fpm)服務,釋放內存後再進行下一輪測試
6、 爲了減少磁盤IO,均關掉了訪問日誌
1、開始測試
(1)靜態文件

測試命令

# autobench --single_host --host1=192.168.8.8 --port1=80 --uri1=/logo.gif --quiet --low_rate=50 --high_rate=1500 --rate_step=50 --num_call=1 --num_conn=2000 --timeout=10 --file /tmp/result.tsv

 

其參數含義

  • --signle_host 只測單機

  • --host1 測試主機地址

  • --uri1 host1 測試URI

  • --quiet 安靜模式

  • --low_rate 測試時最低請求數(指 httperf)

  • --hight_rate 測試時最高請求數

  • --rate_step 每次測試請求數增加步長

  • --num-call 每連接中發起聯接數,一般是1

  • --num_conn 測試聯接數

  • --file 測試結果輸出的 tsv文件

 


測試結果對比分析

測試結果總結:

Apache 與Nginx在併發50~1500時表現得都還可以,只不過在併發數達到1500後Apache的響應時間變得很長,由於系統環境的制約,我沒有再測試大 於1500的併發連接情況,但可以對比看出nginx在1500個併發連接的情況下還能保持較低的響應時間。

(2)動態文件

測試命令

# autobench --single_host --host1=192.168.8.8 --port1=80 --uri1=/test.php --quiet --low_rate=5 --high_rate=100 --rate_step=5 --num_call=1 --num_conn=200 --timeout=10 --file /tmp/nginx_php1.tsv

測試結果數據

併發連接數 nginx實際併發數 apache實際併發數 nginx應答時間 apache應答時間
5.0 5.0 5.0 36.0 36.3
10.0 10.0 10.0 33.0 31.7
15.0 15.0 15.0 35.6 31.9
20.0 19.9 19.9 36.8 32.3
25.0 25.0 25.0 42.6 36.2
30.0 29.8 29.7 45.1 67.6
35.0 34.3 32.4 115.5 248.5
40.0 35.5 34.9 396.8 427.3
45.0 35.3 33.4 699.0 865.8
50.0 35.7 30.5 962.3 1394.0
55.0 35.5 33.3 1103.9 1354.7
60.0 35.7 32.9 1269.2 1471.3
65.0 34.9 33.5 1445.8 1573.6
70.0 37.6 29.7 1458.0 2049.5
75.0 37.2 35.9 1610.1 1496.8
80.0 23.9 31.2 1588.2 1993.3
85.0 24.7 33.2 1674.9 1880.2
90.0 37.1 34.5 1838.6 1946.0
95.0 35.0 30.3 2027.4 2387.2
100.0 35.3 36.4 1996.3 1904.5

測試數據

測試結果對比圖

測試總結

由 上面的報表以及這張曲線圖可以看出,無論是apache還是nginx其php併發大於30其響應時間的就會直線上升,nginx略好於apache,因 此可以判斷這臺服務器的php併發極限在30左右,當然這裏指的php連接中是沒有連接數據庫的,也沒有加入memcached等緩存機制。
(3)高併發下系統資源情況

CPU使用情況對比

內存使用情況對比

系統負載對比

分析測試結果

CPU使用情況
在極限併發的情況下apache和nginx都佔用很多CPU資源,這也是情理之中的事 情。nginx略好於apache平均佔用90%而apache則在95%左右

內存使用情況
在內存對比中可以清楚的看到,nginx在極限併發的情況下內存控制得很好,到達一定程度後就不在變化了,而apache則會直線上升

負載情況
負載情況與內存情況類似,如果高併發時間很長的話apache服務器絕對會掛掉!nginx的負載也很高,但一直保持在10以下,這也和內存佔用有關。
五、結論

利用httperf結合autobench可以很方便的測試出單臺服務器的極限併發數,這樣對服務器性能評估有很大幫助,藉助於autobench的bench2graph腳本可以生成更爲直觀的對比圖。

針 對被測服務器,經過apache與nginx的對比發現,在靜態文件的處理方面如果併發小於1500,apache和nginx之間的差距還是很小的。在 動態php文件的併發測試中,nginx體現出其強大的性能優勢,如果內存足夠大,通過調整php-cgi數量,相信可以承載更多的併發連接。
六、附錄
1、問題解決

(1)當運行時報如下錯誤

httperf: warning: open file limit > FD_SETSIZE; limiting max. # of open files to FD_SETSIZE

解決方法

其意思是說在httperf在發起連接請求時,單個進程已經無法再打開更多的文件描述符。在發起連接請求時httperf使用select()方法使用一個新的文件描述符。因此需要增加文件描述符限制

步驟1:編輯/etc/security/limits.conf 在最後添加下面兩行內容
* hard nofile 102400
* soft nofile 102400

步驟2:編輯 /usr/include/bits/typesizes.h 文件修改__FD_SET_SIZE常量值,如下
#define __FD_SETSIZE 1024
修改爲
#define __FD_SETSIZE 102400

步驟3:重新編譯httperf

 

 

 

 

使用說明:
測試單臺服務器性能,生成tsv文件

#/usr/local/bin/autobench --single_host --host1=192.168.1.200 --port1=80 --uri1=/phpinfo.php --quiet --low_rate=50 --high_rate=1500 --rate_step=50 --num_call=1 --num_conn=2000 --timeout=10 --file /tmp/result.tsv

把tsv文件用圖形表示出來:

#/usr/local/bin/bench2graph /tmp/result.tsv /tmp/result.png [1 2 3 ... ]

 

測試兩臺服務器,生產tsv文件

/usr/local/bin/autobench \
--host1=192.168.1.10 \
--port1=80 \
--host2=192.168.1.11 \
--port2=80 \
--quiet \
--low_rate=100 \
--high_rate=5000 \
--rate_step=10 \
--num_call=1 \
--num_conn=3000 \
--timeout=5 \
--file /tmp/result.tsv

再把生成的tsv文件中數據轉化成圖形
/usr/local/bin/bench2png /tmp/result.tsv /tmp/result.png [ 1 2 3 .... ]

注:
[1 2 3 .... ]的值分別表示如下:

1 dem_req_rate

2   req_rate_nginx.zby.com
3   con_rate_nginx.zby.com
4   min_rep_rate_nginx.zby.com
5   avg_rep_rate_nginx.zby.com
6   max_rep_rate_nginx.zby.com
7   stddev_rep_rate_yhc.zby.com
8   resp_time_nginx.zby.com
9   net_io_nginx.zby.com
10 errors_nginx.zby.com
11 req_rate_apache.zby.com
12con_rate_apache.zby.com
13 min_rep_rate_squid.zby.com
14 avg_rep_rate_squid.zby.com
15 max_rep_rate_squid.zby.com
16 stddev_rep_rate_squid.zby.com
17 resp_time_squid.zby.com
18 net_io_squid.zby.com
19 errors_squid.zby.com

例如,可做下列對比:

2   req_rate_nginx.zby.com 
11 req_rate_squid.zby.com
/usr/local/bin/bench2png /tmp/result.tsv /tmp/result.png [ 2 11 ]


3   con_rate_nginx.zby.com 
12 con_rate_squid.zby.com
/usr/local/bin/bench2png /tmp/result.tsv /tmp/result.png [ 3 12 ] 
    
4   min_rep_rate_nginx.zby.com 
13 min_rep_rate_squid.zby.com 
/usr/local/bin/bench2png /tmp/Result.tsv /tmp/result.png [ 4 13 ]



5   avg_rep_rate_nginx.zby.com  
14 avg_rep_rate_squid.zby.com  
/usr/local/bin/bench2png /tmp/resultdef.tsv /tmp/resulta5_14.png [ 5 14 ]


6   max_rep_rate_nginx.zby.com 
15 max_rep_rate_squid.zby.com 
/usr/local/bin/bench2png /tmp/Resultabc.tsv /tmp/resultaabc6_15.png [ 6 15 ]


7   stddev_rep_rate_nginx.zby.com  
16 stddev_rep_rate_squid.zby.com   
/usr/local/bin/bench2png /tmp/Resultabc.tsv /tmp/resultaabc7_16.png [ 7 16 ]

8   resp_time_nginx.zby.com 
17 resp_time_squid.zby.com  
/usr/local/bin/bench2png /tmp/resultdef.tsv /tmp/resultaabc8_17.png [ 8 17 ]

9   net_io_nginx.zby.com
18 net_io_squid.zby.com
/usr/local/bin/bench2png /tmp/resultdef.tsv /tmp/resultaabc9_18.png [ 9 18 ]


10 errors_nginx.zby.com
19 errors_squid.zby.com
/usr/local/bin/bench2png /tmp/Resultabc.tsv /tmp/resultaabc10_19.png [ 10 19 ]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章