網絡測試工具netperf


一般我們進行網絡測試,主要是測試網絡的連通性、網絡帶寬、網絡響應時間等。常用的工具包括ping、traceroute、telnet、ftp等。如測試網絡連通性,可以使用ping,traceroute,如果測試防火牆是否配置正確,可以使用telnet和traceroute -p,使用ping命令可以測試網絡延遲,ftp則用來測試網絡帶寬。

但如果需要做一些更為深入的測試,如測試不同包大小的不同類型的業務的網絡處理能力,則需要更專業的工具,如netperf,iperf等。

netperf測試工具介紹

netperf是一個開源的網絡性能測試工具。可以在AIX和LINUX平台上安裝,支持跨平台使用。

netperf可以進行的測試TCP網絡性能、UDP網絡性能,並且可以模擬Client/Server長連接或短連接場景,因此能更接近實際網絡的使用環境進行測試和評估。

安裝

官方網站可以下載源代碼進行編譯安裝。安裝過程基本上是老三步,即

./configcure
make
make install

默認安裝路徑是/usr/local下的各目錄。在AIX等系統中,可能需要自己設置PATH環境變量,或使用–prefix參數更改安裝路徑。

對於SUSE,在安裝中發現,在內核版本為2.6.16(SUSE 10)時,會出現編譯錯誤:

nettest_omni.o: In function `recv_data_no_copy':
nettest_omni.c:(.text+0x6e44): undefined reference to `splice'
nettest_omni.c:(.text+0x6e7b): undefined reference to `splice'
collect2: ld returned 1 exit status
make[3]: *** [netperf] Error 1
make[3]: Leaving directory `/root/py/netperf-2.6.0/src'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/root/py/netperf-2.6.0/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/root/py/netperf-2.6.0'

經查,splice系統調用是在2.6.17內核版本以后出現的,因此換用SUSE 11編譯通過。

如果是UBUNTU之類的版本,因為軟件庫中已經有了netperf,可以用包管理器安裝。比如UBUNTU中使用:

sudo apt-get install netperf

使用

啟動服務

netperf包括兩個程序。一個是客戶端netperf,用於模擬各類網絡行為。另一個為服務器程序netserver。用於接收客戶端的請求。啟動服務的操作類似於:

# netserver
Starting netserver with host 'IN(6)ADDR_ANY' port '12865' and family AF_UNSPEC

默認情況下TCP服務的監聽啟動在12865端口上。可以通過-p參數修改。

未發現使用了哪個UDP端口,估計是在測試時根據netperf啟用的測試項目再啟用端口的。

netperf參數說明

netperf的參數格式如下:

netperf [global options] -- [test options] 

其中,global options為通用參數,所有測試項目都涉及或是公共的參數,常用的有:

-H 主機名或IP 指定運行netserver的服務器的IP

-l 測試時長 指定測試的時間長度,單位為秒

-t 測試項目 指定測試的內容。測試項目如下:

TCP批量數據傳輸測試 TCP_STREAM

                 TCP_SENDFILE

                 TCP_MAERTS

TCP請求應答(長連接)模式測試 TCP_RR

                 TCP_CRR

UCP批量數據傳輸測試 UDP_STREAM

                 UDP_RR

                 DLCO_STREAM

                 DLCO_RR

                 DLCL_STREAM

                 DLCL_RR

                 STREAM_STREAM

                 STREAM_RR

                 DG_STREAM

                 DG_RR

                 SCTP_STREAM

                 SCTP_STREAM_MANY

                 SCTP_RR

                 SCTP_RR_MANY

                 LOC_CPU

                 REM_CPU

test specific options是測試項用的參數,它與全局參數之間要用“–”分開類似

netperf -H 127.0.0.1 -l 30 -- -m 2048

測試項參數與測試項目相關。

常用測試項目

網絡帶寬測試

帶寬測試一般使用-t TCP_STREAM測試項,這也是netperf的默認測試項目。此項測試與ftp類似可以測試系統的帶寬,但可以通過參數進行更多的設置。比如:

$ netperf -H 127.0.0.1 -l 60
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 127.0.0.1 () port 0 AF_INET : demo
Recv   Send    Send                          
Socket Socket  Message  Elapsed              
Size   Size    Size     Time     Throughput  
bytes  bytes   bytes    secs.    10^6bits/sec  

 87380  16384  16384    60.00    2760.70 

第一列為服務端接收包的Socket緩沖區大小,這里沒87380

第二列為客戶端發送數據的Socket緩沖區大小,這里為16384

第三列為發送的消息的大小,這里為16384

第四列為測試時長

第五列為測試的速率,單位為M,這里結果為2.7G。因為使用的是localhost,實際是在本機的內存中收發的數據。

TCP_STREAM的常用測試參數有:

-s 緩沖區大小 指定客戶端發送數據的緩沖區大小 -S 緩沖區大小 指定服務端接收數據的緩沖區大小

-m 發送消息大小 單位為bytes

-M 接收消息大小 單位為bytes

可以調整這些參數,了解哪些因素對傳輸速率有影響。比如將發送緩沖變大,測試結果變化不大:

1
2
3
4
5
6
7
8
$ netperf -H 127.0.0.1 -l 60 -- -s 65535 MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 127.0.0.1 () port 0 AF_INET : demo Recv Send Send Socket Socket Message Elapsed Size Size Size Time Throughput bytes bytes bytes secs. 10^6bits/sec   87380 131070 131070 60.00 2672.42 

而改變接收緩沖和發包大小,則可以提升性能:

$ netperf -H 127.0.0.1 -l 60 -- -S 65535 
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 127.0.0.1 () port 0 AF_INET : demo
Recv   Send    Send                          
Socket Socket  Message  Elapsed              
Size   Size    Size     Time     Throughput  
bytes  bytes   bytes    secs.    10^6bits/sec  

131070  16384  16384    60.00    3058.22   
$ netperf -H 127.0.0.1 -l 60 -- -m 65535
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 127.0.0.1 () port 0 AF_INET : demo
Recv   Send    Send                          
Socket Socket  Message  Elapsed              
Size   Size    Size     Time     Throughput  
bytes  bytes   bytes    secs.    10^6bits/sec  

 87380  16384  65535    60.00    3266.55   

UDP協議的傳輸性能

與網絡帶寬測試類似,只是更換了協議,所以這個項目是UDP_STREAM:

$ netperf -H 127.0.0.1 -l 60 -t UDP_STREAM
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 127.0.0.1 () port 0 AF_INET : demo
Socket  Message  Elapsed      Messages                
Size    Size     Time         Okay Errors   Throughput
bytes   bytes    secs            #      #   10^6bits/sec

212992   65507   60.00      440506      0    3847.46
212992           60.00      433151           3783.22

與TCP_STREAM不太一樣,測試結果中有兩行數據。第一行是客戶端的,第二行是服務端。

第一列為緩沖區大小,在netperf測試中,兩端的緩沖區大小會設置成一樣大。

第二列為消息大小

第三列為測試傳輸時間

第四列為傳輸數據包量,UDP由於協議不保證傳輸可靠性,收發消息數量不一樣多,而且實際生產環境收包量可能比發包少得更多。從數據看,這個包數量應是每秒數量(消息大小和速度的單位不一樣)

最后是測試的速率,可以看到要比TCP協議快一些。這是協議決定的。

TCP長連接請求應答模式測試

除了網絡數據傳輸,大量的網絡流量是請求/應答式的,即一方發送一個報文,另一方回復一個。而且通常這類請求和回復的報文大小不一樣大,甚至差別很大。netperf可以簡單模擬這類應用場景,進行網絡性能測試。測試使用類型為TCP_RR。

最簡單的TCP_RR測試如下:

$ netperf -H 127.0.0.1 -l 60 -t TCP_RR
MIGRATED TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 127.0.0.1 () port 0 AF_INET : demo : first burst 0
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       60.00    13517.65   
16384  87380 

測試結果分為兩行,第一行是本地,第二行是遠端(服務端)

第一列和第二列應該還是緩沖區,只是和STREAM測試的順序相反。

第三、四列為請求和返回包的大小。默認為1位。

第五列為測試時間

第六列為交易速率,這次是筆數/每秒,不再是帶寬。

默認的包大小實際業務中不可能發生,可以通過參數進行調整,來模擬真實的情況。使用測試參數-r 請求包大小,應答包大小(-r request,response)來測試。注意此參數單位為BYTES,實際的業務一般是以字節為單位的報文:

$ netperf -H 127.0.0.1 -l 60 -t TCP_RR -- -r 64,2048
MIGRATED TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 127.0.0.1 () port 0 AF_INET : demo : first burst 0
Local /Remote
Socket Size   Request  Resp.   Elapsed  Trans.
Send   Recv   Size     Size    Time     Rate         
bytes  Bytes  bytes    bytes   secs.    per sec   

16384  87380  64       2048    60.00    13129.09   
16384  87380 

此測試使用8字節的請求,256字節的返應答包進行測試,測試結果相對默認值輕微下降。

TCP短連接請求應答模式測試

TCP請求的另一大類是類似HTTP業務的短連接請求應答報文。對應的測試項是TCP_CRR:

$ netperf -H 127.0.0.1 -l 60 -t TCP_CRR             
MIGRATED TCP Connect/Request/Response TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 127.0.0.1 () port 0 AF_INET : demo
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       60.00    2210.55   
16384  87380 

測試參數和顯示與TCP_RR類似。由於業務類型的影響,速率降得比厲害。

UDP連接請求應答模式測試

由於UDP協議的原因,UDP請求應答不分長短連接。只有UDP_RR一個測試項目,測試參數也類似TCP類的測試:

$ netperf -H 127.0.0.1 -l 60 -t UDP_RR              
MIGRATED UDP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 127.0.0.1 () port 0 AF_INET : demo : first burst 0
Local /Remote
Socket Size   Request  Resp.   Elapsed  Trans.
Send   Recv   Size     Size    Time     Rate         
bytes  Bytes  bytes    bytes   secs.    per sec   

212992 212992 1        1       60.00    15837.63   
212992 212992

理論上,UDP的測試結果要好於TCP,但在實際網絡中,可能受網絡設備配置等影響,存在一定未知數。

如何進行模擬測試

首先需要搞好測試用例。要明確業務的類型,協議,好確定選擇哪個測試項目,要了解業務的特性,如一般包的大小等信息,以便選擇合適的參數。這些參數可以根據業務設計來確定,也可能需要通過業務監控數據來獲取。例如通過監控數據中的最大流量和最大IO量,可以大致評估一下數據包的大小,當然這種評估很不精確。

由於決定網絡性能的因素有一部分和配置相關,因此在測試中可以變更緩沖區大小等參數,以便了解是否需要對網絡參數進行調整。


免責聲明!

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



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