本文下載鏈接:
一、Netperf工具簡介
1、什么是Netperf ?
(1)Netperf是由惠普公司開發的一種網絡性能測量工具,主要針對基於TCP或UDP的傳輸。
(2)Netperf根據應用的不同,可以進行不同模式的網絡性能測試,即批量數據傳輸(bulk data transfer)模式和請求/應答(request/reponse)模式。
(3)Netperf測試結果所反映的是一個系統能夠以多快的速度向另外一個系統發送數據,以及另外一個系統能夠以多塊的速度接收數據。
2、Netperf 工作原理
(1)Netperf 工具的工作方式
① Netperf 工具以client/server方式工作。
② server端是netserver,用來偵聽來自client端的連接。
③ client端是netperf,用來向server發起網絡測試。
(2)Netperf 工具的工作原理
在client與server之間,首先建立一個控制連接,用於傳遞有關測試配置的信息,以及測試的結果。在控制連接建立並傳遞了測試配置信息以后,client與server之間會再建立一個測試連接,用來來回傳遞着特殊的流量模式,以測試網絡的性能。
(3)Netperf 工具的工作流程
① 建立控制連接:
-
❶ server端netserver啟動監聽,監聽來自client端netperf 的連接請求;
-
❷ client端向server端發送控制連接請求,server端發現連接請求,建立控制連接。
-
❸ 控制連接創建完成,使用BSD socket傳輸信息,屬於TCP連接。
② 建立測試連接
-
❶ client端通過控制連接向server端傳遞測試配置信息。
-
❷ server端獲取測試配置信息,建立測試連接。
-
❸ 測試連接用於傳輸各種模式的流量測試網絡的性能。
③ 測試網絡性能
-
❶ client端通過測試連接向server端發送Bulk模式流量模式的數據。
-
❷ server端接受Bulk模式流量模式的數據並產生測試結果1。
-
❸ client端通過測試連接向server端發送request/response流量模式的數據。
-
❹ server端接受request/response流量模式的數據並產生測試結果2。
④ 輸出測試結果
-
❶ server端通過控制連接向client端發送測試結果。
-
❷ client端接受到測試結果並顯示或保存。
3、Netperf 安裝
(1)下載安裝 Netperf
wget -c "https://codeload.github.com/HewlettPackard/netperf/tar.gz/netperf-2.5.0" -O netperf-2.5.0.tar.gz
tar -zxvf netperf-2.5.0.tar.gz
cd netperf-netperf-2.5.0
./configure
make && make install
編譯不過可嘗試執行:./configure --build=mips
(2)確認安裝成功
執行netperf -h
和netserver -h
命令,確認安裝成功。
注:服務器及客戶端使用相同的源碼,測試時關閉防火牆
4、網絡性能測量的五項指標
(1)可用性(availability)
測試網絡性能的第一步是確定網絡是否正常工作,最簡單的方法是使用 ping 命令。通過向遠端的機器發送 icmp echo request,並等待接收 icmp echo reply 來判斷遠端的機器是否連通,網絡是否正常工作。
(2)響應時間(response time)
ping 命令的 echo request/reply 一次往返所花費時間就是響應時間。
(3)網絡利用率(network utilization)
網絡利用率是指網絡被使用的時間占總時間(即被使用的時間+空閑的時間)的比例。
網絡測試工具一般使用網絡吞吐量和網絡帶寬容量來確定網絡中兩個節點之間的性能。
(4)網絡吞吐量(network throughput)
網絡吞吐量是指在某個時刻,在網絡中的兩個節點之間,提供給網絡應用的剩余帶寬。
網絡吞吐量非常依賴於當前的網絡負載情況,可以幫組尋找網絡路徑中的瓶頸。
(5)網絡帶寬容量(network bandwidth capacity)
網絡帶寬容量指的是在網絡的兩個節點之間的最大可用帶寬。這是由組成網絡的設備的能力所決定的。
二、Netperf 使用語法
1、neserver語法格式
參數 | 說明 |
---|---|
-H host | 指定遠端運行netserver的server IP地址 |
2、netperf語法格式
netperf 通過命令行參數來控制測試的類型和具體的測試選項。
netperf 命令行參數分為兩大類:全局命令行參數、測試相關的局部參數,兩者之間使用--分隔。
[root@Netperf-test ~]# netperf -h
Usage: netperf [global options] -- [test options]
Global options:
-a send,recv Set the local send,recv buffer alignment
-A send,recv Set the remote send,recv buffer alignment
-B brandstr Specify a string to be emitted with brief output
-c [cpu_rate] Report local CPU usage
-C [cpu_rate] Report remote CPU usage
-d Increase debugging output
-D time,[units] * Display interim results at least every time interval
using units as the initial guess for units per second
A negative value for time will make heavy use of the
system's timestamping functionality
-f G|M|K|g|m|k Set the output units
-F lfill[,rfill]* Pre-fill buffers with data from specified file
-h Display this text
-H name|ip,fam * Specify the target machine and/or local ip and family
-i max,min Specify the max and min number of iterations (15,1)
-I lvl[,intvl] Specify confidence level (95 or 99) (99)
and confidence interval in percentage (10)
-j Keep additional timing statistics
-l testlen Specify test duration (>0 secs) (<0 bytes|trans)
-L name|ip,fam * Specify the local ip|name and address family
-o send,recv Set the local send,recv buffer offsets
-O send,recv Set the remote send,recv buffer offset
-n numcpu Set the number of processors for CPU util
-N Establish no control connection, do 'send' side only
-p port,lport* Specify netserver port number and/or local port
-P 0|1 Don't/Do display test headers
-r Allow confidence to be hit on result only
-s seconds Wait seconds between test setup and test start
-S Set SO_KEEPALIVE on the data connection
-t testname Specify test to perform
-T lcpu,rcpu Request netperf/netserver be bound to local/remote cpu
-v verbosity Specify the verbosity level
-W send,recv Set the number of send,recv buffers
-v level Set the verbosity level (default 1, min 0)
-V Display the netperf version and exit
-y local,remote Set the socket priority
-Y local,remote Set the IP_TOS. Use hexadecimal.
-Z passphrase Set and pass to netserver a passphrase
(1)全局命令行參數 [global options]
參數 | 說明 |
---|---|
-H host | 指定遠端運行netserver的server IP地址 |
-l testlen | 指定測試的時間長度(秒) |
-t testname | 指定進行的測試類型(包括TCP_STREAM,UDP_STREAM,TCP_RR,TCP_CRR,UDP_RR)。 |
(2)局部可選參數 [test options]
參數 | 說明 |
---|---|
-s size | 設置本地系統的socket發送與接收緩沖大小 |
-S size | 設置遠端系統的socket發送與接收緩沖大小 |
-m size | 設置本地系統發送測試分組的大小,測試PPS時值為1。測試BPS時為1400。 |
-M size | 設置遠端系統接收測試分組的大小 |
-p port | 設置測試連接Server端的端口 |
-D | 對本地與遠端系統的socket設置TCP_NODELAY選項 |
-r req,resp | 設置request和reponse分組的大小 |
2、Netperf 模擬的流量模式
(1)Netperf 模擬的TCP流量模式
-
單個TCP連接,批量(bulk)傳輸大量數據
-
單個TCP連接,request/response流量模式
-
多個TCP連接,每個連接中一對request/response的交易(transaction)方式
TCP協議提供端到端]的可靠傳輸,但可靠性的建立會消耗一定的網絡帶寬。
(2)Netperf 模擬的UDP流量模式
-
從client到server的單向批量傳輸
-
請求/應答request/response的交易方式
UDP不保證傳輸的可靠性,在使用netperf時要確保發送的緩沖區大小不大於接收緩沖區大小,否則數據會丟失,netperf將給出錯誤的結果。因此,對於接收到分組的統計不一定准確,需要結合發送分組的統計綜合得出結論。
三、Netperf 測試實例
Netperf 測試主要分服務端和客戶端,在一台主機運行服務端netserver,在另一台主機運行客戶端netperf。
- 服務端:192.168.0.128
- 客戶端:192.168.0.120
測試通過單個TCP連接傳輸批量數據。
1、啟動服務端
[root@Netserver-test ~]# netserver -p 4444 //服務端開放4444端口用於監聽
Starting netserver with host 'IN(6)ADDR_ANY' port '12865' and family AF_UNSPEC
通常建議在server端執行sar命令來統計實際收到的包並作為實際結果:sar -n DEV 1 320
。
2、啟動客戶端
[root@Netperf-test ~]# netperf -H 192.168.0.128 -l 60 --m 1
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec
87380 16384 16384 60.01 935.66
測試結果:顯示吞吐量是881.21Mb/s。
四、Netperf 網絡性能測試分類
1、批量(bulk)網絡流量的性能測試
根據使用傳輸協議的不同,批量數據傳輸又分為TCP批量傳輸和UDP批量傳輸。
(1)TCP_STREAM
Netperf缺省情況下進行TCP批量傳輸,即-t TCP_STREAM,用來測試進行TCP批量傳輸時的網絡性能。
測試過程中,netperf向netserver發送批量的TCP數據分組,以確定數據傳輸過程中的吞吐量。
[root@Netperf-test ~]# netperf -H 192.168.0.128 -l 60
TCP STREAM TEST to 192.168.0.128
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的結果輸出中可知:
-
遠端系統(即server)使用大小為87380字節的socket接收緩沖
-
本地系統(即client)使用大小為16384字節的socket發送緩沖
-
向遠端系統發送的測試分組大小為16384字節
-
測試經歷的時間為60秒
-
吞吐量的測試結果為88Mbits/秒
在缺省情況下,netperf向netserver發送的測試分組大小設置為本地系統所使用的socket發送緩沖大小。
如果懷疑路由器由於缺乏足夠的緩沖區空間,使得轉發大的分組時存在問題,就可以增加測試分組(-m)的大小,以觀察吞吐量的變化。減小測試分組的大小,如果吞吐量有了較大的提升,則說明在網絡中間的路由器確實存在緩沖區的問題。
(2)UDP_STREAM
UDP_STREAM用來測試進行UDP批量傳輸時的網絡性能。
測試UDP的網絡性能時,測試分組的大小不得大於socket的發送與接收緩沖大小,否則netperf會報出錯提示。
[root@Netperf-test ~]# netperf -t UDP_STREAM -H 192.168.0.128 -l 60
UDP UNIDIRECTIONAL SEND TEST to 192.168.0.128
udp_send: data send error: Message too long
為了避免這樣的情況,可以通過命令行參數限定測試分組的大小,或者增加socket的發送/接收緩沖大小。
UDP_STREAM方式使用使用-m來修改測試中使用分組的大小。
[root@Netperf-test ~]# netperf -t UDP_STREAM -H 192.168.0.128 -- -m 1024
UDP UNIDIRECTIONAL SEND TEST to 192.168.0.128
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方式的結果中有兩行測試數據:
第一行顯示的是本地系統的發送統計,吞吐量93.55Mbits/秒表示netperf向本地socket發送分組的能力。但是UDP是不可靠的傳輸協議,發送出去的分組數量不一定等於接收到的分組數量。
第二行顯示的就是遠端系統接收的情況,遠端系統的吞吐量93.54Mbits/秒也幾乎等於本地系統的發送吞吐量。但是,在實際環境中,一般遠端系統的socket緩沖大小不同於本地系統的socket緩沖區大小,而且由於UDP協議的不可靠性,遠端系統的接收吞吐量要遠遠小於發送出去的吞吐量。
2、請求/應答(request/response)網絡流量的性能測試
在client/server結構中的request/response模式。在每次交易(transaction)中,client向server發出小的查詢分組,server接收到請求,經處理后返回大的結果數據。
(1)TCP_RR
TCP_RR方式的測試對象是多次TCP request和response的交易過程,但發生在同一個TCP連接中,這種模式常常出現在數據庫應用中。數據庫的client程序與server程序建立一個TCP連接以后,就在這個連接中傳送數據庫的多次交易過程。
[root@Netperf-test ~]# netperf -t TCP_RR -H 192.168.0.128
TCP REQUEST/RESPONSE TEST to 192.168.0.128
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次/秒。
通過使用-r參數設置request和reponse分組的大小,可以進行更有實際意義的測試。
[root@Netperf-test ~]# netperf -t TCP_RR -H 192.168.0.128 -- -r 32,1024
TCP REQUEST/RESPONSE TEST to 192.168.0.128
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
(2)TCP_CRR
TCP_CRR的測試對象是多次TCP request和response的交易過程,但為每次交易建立一個新的TCP連接。最典型的應用就是HTTP,每次HTTP交易是在一條單獨的TCP連接中進行的。因此,由於需要不停地建立新的TCP連接,並且在交易結束后拆除TCP連接,交易率一定會受到很大的影響。
[root@Netperf-test ~]# netperf -t TCP_CRR -H 192.168.0.128
TCP Connect/Request/Response TEST to 192.168.0.128
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連接所帶來的負擔,所以我們推測交易率一定會有相應的提升。
[root@Netperf-test ~]# netperf -t UDP_RR -H 192.168.0.128
UDP REQUEST/RESPONSE TEST to 192.168.0.128
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不同的緩沖區空間和處理技術。
五、學習筆記參考資料
1、《Netperf-百度百科》,https://baike.baidu.com/item/netperf/11070957?fr=aladdin
2、《Netperf安裝及使用》,soloate,https://www.cnblogs.com/soloate/p/5763748.html
3、《netperf 與網絡性能測量》,湯凱,https://www.ibm.com/developerworks/cn/linux/l-netperf/
4、《網絡性能測試方法》,阿里雲幫助文檔,https://help.aliyun.com/knowledge_detail/55757.html#HFXbx