一、簡介
Netperf是由惠普公司開發的,測試網絡棧。即測試不同類型的網絡性能的benchmark工具,大多數網絡類型TCP/UPD端對端的性能,得到網絡上不同類型流量的性能參數。Netperf根據應用的不同可以進行不同模式的網絡性能測試,即:批量數據傳輸模式和請求/應答模式。Netperf測試結果所反映的是一個系統能夠以多快的速度向另外一個系統發送數據,以及另外一個系統能夠以多快的速度接收數據。
官方網址:http://www.netperf.org/netperf
1.1、工作原理
Netperf工具以client/server方式工作。server端是netserver,用來偵聽來自client端的連接,client端是netperf,用來向server發起網絡測試。在client與server之間,首先建立一個控制連接,傳遞有關測試配置的信息,以及測試的結果;在控制連接建立並傳遞了測試配置信息以后,client與server之間會再建立一個測試連接,用來來回傳遞着特殊的流量模式,以測試網絡的性能。具體過程如下圖所示:
二.安裝環境
操作系統:CentOS 6.0
內核:2.6.18
網絡:千兆以太網
編譯、安裝源碼
下載地址:ftp://ftp.netperf.org/netperf/netperf-2.6.0.tar.gz
三、編譯安裝
1、下載到Downloads文件夾中
2、啟動終端,切換到Downloads中
3、運行一下命令
tar zxvf netperf-2.6.0.tar.gz cd netperf-2.6.0 ./configure make make install
|
四、Netperf使用
4.1、netperf語法
netperf語法格式為:
Netperf [global options] –-[test-specific options]
[global options] 可選參數,其中可選的參數有如下幾個:
參數 |
說明 |
-H host |
指定遠端運行netserver的server IP地址 |
-l testlen |
指定測試的時間長度(秒) |
-t testname |
指定進行的測試類型(TCP_STREAM,UDP_STREAM,TCP_RR,TCP_CRR,UDP_RR) |
[test-specific options] 可選參數,其中可選的參數有如下幾個:
參數 |
說明 |
-s size |
設置本地系統的socket發送與接收緩沖大小 |
-S size |
設置遠端系統的socket發送與接收緩沖大小 |
-m size |
設置本地系統發送測試分組的大小 |
-M size |
設置遠端系統接收測試分組的大小 |
-D |
對本地與遠端系統的socket設置TCP_NODELAY選項 |
-r req,resp |
設置request和reponse分組的大小 |
遠程主機: NPtcp [options]
本地主機: NPtcp -h remote_host [options]
4.2、netperf實例
4.2.1批量(bulk)網絡流量的性能
批量數據傳輸典型的例子有ftp和其它類似的網絡應用(即一次傳輸整個文件)。根據使用傳輸協議的不同,批量數據傳輸又分為TCP批量傳輸和UDP批量傳輸。
1. TCP_STREAM
Netperf缺省情況下進行TCP批量傳輸,即-t TCP_STREAM。測試過程中,netperf向netserver發送批量的TCP數據分組,以確定數據傳輸過程中的吞吐量:
#./netperf -H 192.168.0.28 -l 60 TCP STREAM TEST to 192.168.0.28 Recv Send Send Socket Socket Message Elapsed Size Size Size Time Throughput bytes bytes bytes secs. 10^6bits/sec 87380 16384 16384 60.00 88.00 |
從netperf的結果輸出中,我們可以知道以下的一些信息:
1) 遠端系統(即server)使用大小為87380字節的socket接收緩沖
2) 本地系統(即client)使用大小為16384字節的socket發送緩沖
3) 向遠端系統發送的測試分組大小為16384字節
4) 測試經歷的時間為60秒
5) 吞吐量的測試結果為88Mbits/秒
在缺省情況下,netperf向發送的測試分組大小設置為本地系統所使用的socket發送緩沖大小。TCP_STREAM方式下與測試相關的局部參數如下所示:
參數 |
說明 |
-s size |
設置本地系統的socket發送與接收緩沖大小 |
-S size |
設置遠端系統的socket發送與接收緩沖大小 |
-m size |
設置本地系統發送測試分組的大小 |
-M size |
設置遠端系統接收測試分組的大小 |
-D |
對本地與遠端系統的socket設置TCP_NODELAY選項 |
通過修改以上的參數,並觀察結果的變化,我們可以確定是什么因素影響了連接的吞吐量。例如,如果懷疑路由器由於缺乏足夠的緩沖區空間,使得轉發大的分組時存在問題,就可以增加測試分組(-m)的大小,以觀察吞吐量的變化:
#./netperf -H 192.168.0.28 -l 60 -- -m 2048 TCP STREAM TEST to 192.168.0.28 Recv Send Send Socket Socket Message Elapsed Size Size Size Time Throughput bytes bytes bytes secs. 10^6bits/sec 87380 16384 2048 60.00 87.62 |
在這里,測試分組的大小減少到2048字節,而吞吐量卻沒有很大的變化(與前面例子中測試分組大小為16K字節相比)。相反,如果吞吐量有了較大的提升,則說明在網絡中間的路由器確實存在緩沖區的問題。
2. UDP_STREAM
UDP_STREAM用來測試進行UDP批量傳輸時的網絡性能。需要特別注意的是,此時測試分組的大小不得大於socket的發送與接收緩沖大小,否則netperf會報出錯提示:
#./netperf -t UDP_STREAM -H 192.168.0.28 -l 60 UDP UNIDIRECTIONAL SEND TEST to 192.168.0.28 udp_send: data send error: Message too long |
為了避免這樣的情況,可以通過命令行參數限定測試分組的大小,或者增加socket的發送/接收緩沖大小。UDP_STREAM方式使用與TCP_STREAM方式相同的局部命令行參數,因此,這里可以使用-m來修改測試中使用分組的大小:
#./netperf -t UDP_STREAM -H 192.168.0.28 -- -m 1024 UDP UNIDIRECTIONAL SEND TEST to 192.168.0.28 Socket Message Elapsed Messages Size Size Time Okay Errors Throughput bytes bytes secs # # 10^6bits/sec 65535 1024 9.99 114127 0 93.55 65535 9.99 114122 93.54 |
UDP_STREAM方式的結果中有兩行測試數據,第一行顯示的是本地系統的發送統計,這里的吞吐量表示netperf向本地socket發送分組的能力。但是,我們知道,UDP是不可靠的傳輸協議,發送出去的分組數量不一定等於接收到的分組數量。
第二行顯示的就是遠端系統接收的情況,由於client與server直接連接在一起,而且網絡中沒有其它的流量,所以本地系統發送過去的分組幾乎都被遠端系統正確的接收了,遠端系統的吞吐量也幾乎等於本地系統的發送吞吐量。但是,在實際環境中,一般遠端系統的socket緩沖大小不同於本地系統的socket緩沖區大小,而且由於UDP協議的不可靠性,遠端系統的接收吞吐量要遠遠小於發送出去的吞吐量。
4.2.2請求/應答(request/response)網絡流量的性能
另一類常見的網絡流量類型是應用在client/server結構中的request/response模式。在每次交易(transaction)中,client向server發出小的查詢分組,server接收到請求,經處理后返回大的結果數據。如下圖所示:
1. TCP_RR
TCP_RR方式的測試對象是多次TCP request和response的交易過程,但是它們發生在同一個TCP連接中,這種模式常常出現在數據庫應用中。數據庫的client程序與server程序建立一個TCP連接以后,就在這個連接中傳送數據庫的多次交易過程。
#./netperf -t TCP_RR -H 192.168.0.28 TCP REQUEST/RESPONSE TEST to 192.168.0.28 Local /Remote Socket Size Request Resp. Elapsed Trans. Send Recv Size Size Time Rate bytes Bytes bytes bytes secs. per sec 16384 87380 1 1 10.00 9502.73 16384 87380 |
Netperf輸出的結果也是由兩行組成。第一行顯示本地系統的情況,第二行顯示的是遠端系統的信息。平均的交易率(transaction rate)為9502.73次/秒。注意到這里每次交易中的request和response分組的大小都為1個字節,不具有很大的實際意義。用戶可以通過測試相關的參數來改變request和response分組的大小,TCP_RR方式下的參數如下表所示:
參數 |
說明 |
-s size |
設置本地系統的socket發送與接收緩沖大小 |
-S size |
設置遠端系統的socket發送與接收緩沖大小 |
-r req,resp |
設置request和reponse分組的大小 |
-D |
對本地與遠端系統的socket設置TCP_NODELAY選項 |
通過使用-r參數,我們可以進行更有實際意義的測試:
#./netperf -t TCP_RR -H 192.168.0.28 -- -r 32,1024 TCP REQUEST/RESPONSE TEST to 192.168.0.28 Local /Remote Socket Size Request Resp. Elapsed Trans. Send Recv Size Size Time Rate bytes Bytes bytes bytes secs. per sec 16384 87380 32 1024 10.00 4945.97 16384 87380 |
從結果中可以看出,由於request/reponse分組的大小增加了,導致了交易率明顯的下降。注:相對於實際的系統,這里交易率的計算沒有充分考慮到交易過程中的應用程序處理時延,因此結果往往會高於實際情況。
2. TCP_CRR
與TCP_RR不同,TCP_CRR為每次交易建立一個新的TCP連接。最典型的應用就是HTTP,每次HTTP交易是在一條單獨的TCP連接中進行的。因此,由於需要不停地建立新的TCP連接,並且在交易結束后拆除TCP連接,交易率一定會受到很大的影響。
#./netperf -t TCP_CRR -H 192.168.0.28 TCP Connect/Request/Response TEST to 192.168.0.28 Local /Remote Socket Size Request Resp. Elapsed Trans. Send Recv Size Size Time Rate bytes Bytes bytes bytes secs. per sec 131070 131070 1 1 9.99 2662.20 16384 87380 |
|
即使是使用一個字節的request/response分組,交易率也明顯的降低了,只有2662.20次/秒。TCP_CRR使用與TCP_RR相同的局部參數。
3. UDP_RR
UDP_RR方式使用UDP分組進行request/response的交易過程。由於沒有TCP連接所帶來的負擔,所以我們推測交易率一定會有相應的提升。
#./netperf -t UDP_RR -H 192.168.0.28 UDP REQUEST/RESPONSE TEST to 192.168.0.28 Local /Remote Socket Size Request Resp. Elapsed Trans. Send Recv Size Size Time Rate bytes Bytes bytes bytes secs. per sec 65535 65535 1 1 9.99 10141.16 65535 65535 |
結果證實了我們的推測,交易率為10141.16次/秒,高過TCP_RR的數值。不過,如果出現了相反的結果,即交易率反而降低了,也不需要擔心,因為這說明了在網絡中,路由器或其它的網絡設備對UDP采用了與TCP不同的緩沖區空間和處理技術。
五、測試
測試主要分服務端和客戶端,在一台主機運行服務端netserver,在另一台枬運行客戶端netperf就開始測試了。以下簡單介紹一下怎么測試通過單個TCP連接傳輸批量數據。
啟動服務端: netserver -D -p 4444 |
服務端開放4444端口用於監聽。
啟動客戶端: netperf -H server -p 4444 -l 60 |
客戶端連接服務端的4444端口,測試的時間為60秒。
測試結果如下: Recv Send Send Socket Socket Message Elapsed Size Size Size Time Throughput bytes bytes bytes secs. 10^6bits/sec
87380 16384 16384 60.03 881.21 測試結果顯示吞吐量是881.21Mb/s。 |