2011年9月30日 星期五

iperf3測試網路負載

iperf是一個透過tcp測試系統網路能力的工具,由於可以專門測試tcp層不管application layer的干擾,因此特別適合用於針對系統底層網路能力來測試,例如網路卡、驅動程式、作業系統等等。

目前iperf已經出到3.0版,還在beta中,不過根據經驗之前版本的iperf反而不是很穩定,因此建議還是以iperf3作為測試的工具。

安裝
可以到此處下載
解開後經過編譯與安裝就可使用

註解: 如果使用ubuntu,需要先安裝build-essential uuid-dev,然後才能編譯與安裝
apt-get install build-essential uuid-dev
./configure
make
make install

執行
執行架構可分為client與server兩端

在server端執行如下指令即可
iperf3 -s

在client端執行下列指令
iperf3 -c -t -i

進階參數設定
還有下列幾個進階的參數可以設定,但若要使用下列參數,則server與client都要同時下一樣的參數值才行
-w n[KM]  指定 TCP window size
-l n[KM] 指定 read/write buffer 大小(預設為 8k)
-Pn (大寫的P) client 端指定同時 (parallel) 跑幾個的 threads

結果
在server端與client端都會有結果出現,兩者會不太一樣,但相當接近
最後cilent的結果如下
[ ID] Interval       Transfer     Bandwidth
      Sent
[  5] 0.00-20.00 sec  80.6 GBytes  34.6 Gbits/sec
      Received
[  5] 0.00-20.00 sec  80.6 GBytes  34.6 Gbits/sec 
分別代表執行時間、總下載數(單位為byte)與平均傳輸速度(單位為bits)

參考資料
iperf3官方網頁
iperf2官方網頁
更詳細的教學網頁
Windows版本的教學網頁

2011年9月29日 星期四

使用httperf與autobench測量web server的performance

httperf是個可以用來協助對web server進行壓力測試與效能測試的工具。若是對系統底層進行修改或者需要瞭解效能,也可以透過此工具幫助測試。但httperf使用上並不是很容易,因此可以搭配autobench來使用。

1. 安裝

安裝httperf可到此處下載
如果是ubuntu可以使用下列指令安裝
sudo apt-get install httperf

安裝autobench
可到此處下載
如果是debian或者ubuntu,可以直接下載deb安裝
sudo dpkg -i autobench_2.1.2_i386.deb

2. 設定
在執行autobench的帳號下設定~/.autobench.conf

範例
low_rate  = 10 #從concurrent 10的connection開始
high_rate = 100 #最高到達concurrent 100個connection
rate_step = 10 #每次增加10個connection
const_test_time = 10 #每隔10秒增加一次
num_call = 1 #測試要跑幾次
timeout = 2 #response time超過2秒算失敗
output_fmt = tsv #結果的副檔名
httperf_add-header = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 ``\n``Accept-Language: zh-tw,en-us;q=0.7,en;q=0.3 ``\n``Accept-Encoding: gzip, deflate ``\n``Accept-Charset: UTF-7,* ``\n``" #加上HTTP header


3. 使用
client端先開一視窗執行autobenchd --debug,此deamon也可以運行在另外一台機器上。client端在開另一視窗執行下列指令
autobench_admin --host1 --port1 --uri1 --single_host --client :4600 --file

範例
autobench_admin --host1 www.test.com --port1 1180 --uri1 /sleep.php --single_host --client test.machine.com:4600 --file result
autobench_admin --host1 www.test.com --port1 8033 --uri1 /test.htm --host2 www.test2.com --port2 8033 --uri2 /test.htm --client localhost:4600 --file result --output_fmt tsv


但最多只能支援到兩個host,沒辦法使用到--host3以後的。記得apache的maxclients要開到最大,以確保能夠測試到該機器的最大上限

4. 結果
結果的重點是倒數第3個欄位resp_time(單位為mini seconds)。其次是看最後一個欄位errors,當然前述timeout時間設的越短,errors就容易飆高。

需要看圖的話記得安裝gawk與gnuspot
執行bench2graph [source file] [target file of ps type] [....]
[...]分別代表dem_req_rate req_rate con_rate min_rep_rate avg_rep_rate max_rep_rate stddev_rep_rate resp_time net_io errors
執行bench2graph result.tsv result.ps 2 4 5 6 8 9 10 就可以轉為相對應圖片

5. 自定URI清單
若需指定測試的URI清單,可在.autobench.conf加上httperf_wlog=B,F
B 選項可以是y/n,y 表示如果到清單底部會重新從頭開始,n代表清單到底壓測結束
F 選項就是 access list 的檔案
清單斷行必須以特殊字元結尾,可用此指令轉換 perl -ne 's/\n/\0/m; print $_;' [infile] > [outfile]

6. 疑難排解
6.1 open file limit > FD_SETSIZE
若執行時發現下列錯誤
httperf: warning: open file limit > FD_SETSIZE; limiting max. # of open files to FD_SETSIZE
代表執行的帳號所設定的每個process所能開啟的檔案數量不足(預設為1024),可以使用ulimit -a指令來確認open file的欄位

需要進行下列三個步驟才能讓上限更高
1. 修改/etc/security/limits.conf,並加入類似下列設定
* hard nofile 65532
* soft nofile 65532
root hard nofile 65532
root soft nofile 65532

重開機後即可生效。對於ulimit設定若還有其他問題可見此份文件

2. 修改/usr/include/i386-linux-gnu/bits/typesizes.h__FD_SETSIZE欄位,從 #define __FD_SETSIZE 1024 改為 #define __FD_SETSIZE 65532。原因在於httperf開檔時,c會依據/usr/include/i386-linux-gnu/sys/select.h定義的FD_SETSIZE來檢查上限是否已經到達,而此值就是從/usr/include/i386-linux-gnu/bits/typesizes.h__FD_SETSIZE定義所來的。
ps. 如果是舊版的ubuntu,應該會是/usr/include/bits/typesizes.h__FD_SET_SIZE欄位。如果是使用64bit環境,typesizes.h會位在/usr/include/x86_64-linux-gnu/bits/typesizes.h,欄位__FD_SETSIZE

3. 下載httperf原始檔並重新編譯安裝。如果發現還是沒有生效,可使用httperf --version確認編譯時間是否正確。如果發現時間有誤,透過whereis httperf指令檢查是否系統內還有其他httperf落在系統其他地方。其他相關的討論可見此份文件

6.2 connection failed with unexpected error
若執行時出現類似下列錯誤訊息
Zero replies received, test invalid: rate 200
httperf: connection failed with unexpected error 113


這種摸不著頭緒的錯誤訊息,可以使用下列訊息搜尋系統.h檔定義
grep 113 /usr/include/*/*errno*

可以看到以此例來說,可能是網路不通或者是web server並未開啟
/usr/include/asm-generic/errno.h:#define    EHOSTUNREACH    113    /* No route to host */

7. 相關連結
httperf man doc
autobench man doc
對岸的詳細教學1
對岸的詳細教學2
對岸的詳細教學3
對岸的詳細教學4