網絡性能評估工具Iperf詳解(可測丟包率)
一、網絡性能評估工具Iperf
網絡性能評估主要是監測網絡帶寬的使用率,將網絡帶寬利用最大化是保證網絡性能的基礎,但是由於網絡設計不合理、網絡存在安全漏洞等原因,都會導致網絡帶寬利用率不高。要找到網絡帶寬利用率不高的原因,就需要對網絡傳輸進行監控,此時就需要用到一些網絡性能評估工具,而Iperf就是這樣一款網絡帶寬測試工具,本節將詳細介紹一下Iperf的使用。
1、Iperf能做什麼
Iperf是一款基於TCP/IP和UDP/IP的網絡性能測試工具,它可以用來測量網絡帶寬和網絡質量,還可以提供網絡延遲抖動、數據包丟失率、最大傳輸單元等統計信息。網絡管理員可以根據這些信息瞭解並判斷網絡性能問題,從而定位網絡瓶頸,解決網絡故障。
下面介紹Iperf的主要功能。
(1)TCP方面
q 測試網絡帶寬。
q 支持多線程,在客戶端與服務端支持多重連接。
q 報告MSS/MTU值的大小。
q 支持TCP窗口值自定義並可通過套接字緩衝。
(2)UDP方面
q 可以設置指定帶寬的UDP數據流
q 可以測試網絡抖動值、丟包數
q 支持多播測試
q 支持多線程,在客戶端與服務端支持多重連接。
二、Iperf的安裝與使用
iperf可以運行在任何IP網絡上,包括本地以太網、接入因特網、Wi-Fi網絡等。在工作模式上,iperf運行於服務器、客戶端模式下,其服務器端主要用於監聽到達的測試請求,而客戶端主要用於發起連接會話,因此要使用iperf,需要兩臺服務器,一臺運行在服務器模式下,另一臺運行在客戶端模式下。
1.安裝iperf
iperf支持Win32、Linux、FreeBSD、MacOS X、OpenBSD和Solaris等多種操作系統平臺。讀者可以從iperf官方主頁http://iperf.fr/ 下載各種版本,目前最新的版本是iperf3.0,這裏下載的軟件包爲iperf-3.0.tar.gz,安裝過程如下:
# wget http://downloads.es.net/pub/iperf/iperf-3.0.6.tar.gz
# tar zxvf iperf-3.0.6.tar.gz
# cd iperf-3.0.6
# ./configure
# make
# make install
2.iperf參數介紹
在完成iperf安裝後,執行“iperf3 –h”即可顯示iperf的詳細用法。iperf的命令行選項共分爲三類,分別是客戶端與服務器端公用選項、服務器端專用選項和客戶端專用選項,下面對常用的選項進行介紹。
服務器端專用選項的含義如表1所示。
表1 服務器端專用選項的含義
客戶端專用選項的含義如表2.5所示。
表2 客戶端專用選項的含義
客戶端與服務器端公用選項的含義如表3所示。
表3 客戶端與服務器端公用選項的含義
三、 Iperf應用實例
要使用iperf,首先要啓用一個服務端,這裏假定服務端的IP地址爲192.168.12.168,在此服務器上運行“iperf3 -s”即可開啓iperf的服務器模式。在默認情況下,iperf3將在服務端打開一個5201監聽端口,此時就可以將另一臺服務器作爲客戶端執行iperf功能測試了。
1.測試TCP吞吐量
爲了確定網卡的最大吞吐量,可以在任意客戶端運行iperf命令,iperf將嘗試從客戶端儘可能快地向服務端發送數據請求,並且會輸出發送的數據量和網卡平均帶寬值。圖1是一個最簡單的帶寬測試命令。
圖1通過iperf測試網絡帶寬利用率
從圖1可以看出,iperf默認的運行時間是10秒鐘,每隔一秒鐘輸出一次傳輸狀態,同時還可以看到每秒鐘傳輸的數據量在112MB左右,剛好與“Bandwidth”列的值對應起來,網卡的帶寬速率維持在941Mbits/sec左右,而測試的服務器是千兆網卡,這個測試值也基本合理。在輸出的最後,iperf還給出了總的數據發送、接收量,並給出了帶寬速率平均值,通過這些值,基本可以判斷網絡帶寬是否正常,網絡傳輸狀態是否穩定。
iperf提供很多參數,可以多角度、全方位地測試網絡帶寬利用率,例如,要改變iperf運行的時間和輸出頻率,可以通過“-t”和“-i”參數來實現,如圖2所示。
圖2 添加“-t”和“-i”參數後的iperf輸出
從圖2 可以看出,輸出狀態的間隔變爲每5秒鐘一次,總共執行測試時間爲20秒,測試的帶寬速率仍然保持在941Mbits/sec左右,唯一變化的是失敗重傳次數增加了。
爲了模擬大量的數據傳輸,也可以指定要發送的數據量,這可以通過“-n”參數來實現。在指定“-n”參數後,“-t”參數失效,iperf在傳輸完畢指定大小的數據包後,自動結束,如圖3所示。
圖3 iperf客戶端通過“-n”參數指定要傳輸的數據量
圖3的例子是指定發送一個5GB左右的數據包,並且每隔10秒鐘輸出一次傳輸狀態,從這個輸出可以看出,當失敗重傳次數較多時,傳輸速率急速下降。
有時候,爲了模擬更真實的TCP應用,iperf客戶端允許從一個特定的文件發送數據,這可以通過“-F”參數實現,如圖4所示。
圖4 iperf客戶端通過“-F”參數指定文件來發送數據
在圖4的例子中,通過“-F”參數指定了一個webdata.tar.gz文件作爲iperf要傳輸的數據,在使用此參數時,需要同時指定一個“-t”參數來設置要測試傳輸的時間,這個時間儘量設置長一些,因爲在默認傳輸時間10秒內,這個文件可能還沒有傳完。
在使用iperf進行網絡帶寬測試時,如果沒有指定發送方式,iperf客戶端只會使用一個單一的線程,而iperf是支持多線程的,可以使用iperf提供的“-P”參數來設置多線程的數目,通過使用多線程,可以在一定程度上增加網絡的吞吐量。
下面通過兩個例子進行簡單對比,圖5是iperf使用單線程傳輸1.86GBytes數據所消耗的時間和帶寬使用情況。爲了速率單位統一,這裏使用“-f”參數將輸出結果都通過MBytes來顯示。
圖5 iperf在單線程模式下的傳輸時間和傳輸速率
從圖5中可以看出,傳輸1.86GBytes的數據消耗了17秒的時間,平均帶寬速率爲112MBytes/sec(注意單位).下面再看看使用多線程後,iperf傳輸同樣大小數據量所消耗的時間和平均帶寬速率,如圖6所示。
圖6 iperf使用多線程後的數據傳輸狀態
這裏通過“-P”參數開啓了2個多線程,從傳輸時間上看,傳輸1.86GBytes的數據,消耗時間爲10.79秒,比之前單線程的傳輸時間少了近7秒鐘,在平均帶寬速率上,從之前單線程的112MBytes/sec提高到177MBytes/sec,從這個結果可以看出,多線程對網絡傳輸性能的提高不小。
2 . 測試UDP丟包和延遲
iperf也可以用於UDP數據包吞吐量、丟包率和延遲指標,但是由於UDP協議是一個非面向連接的輕量級傳輸協議,並且不提供可靠的數據傳輸服務,因此對UDP應用的關注點不是傳輸數據有多快,而是它的丟包率和延時指標。通過iperf的“-u”參數即可測試UDP應用的傳輸性能,圖7測試的是在iperf客戶端傳輸100MB的UDP數據包的輸出結果.:
圖7 iperf傳輸100MB的UDP數據包的輸出結果
在圖7中,重點關注虛線下的一段內容,在這段輸出中,“Jitter”列表示抖動時間,或者稱爲傳輸延遲,“Lost/Total”列表示丟失的數據報和總的數據報數量,後面的0.33%是平均丟包的比率,“Datagrams”列顯示的是總共傳輸數據報的數量。
這個輸出結果過於簡單,要了解更詳細的UDP丟包和延時信息,可以在iperf服務端查看,因爲在客戶端執行傳輸測試的同時,服務端也會同時顯示傳輸狀態,如圖8所示。
圖8 iperf服務端顯示的UDP傳輸狀態
在這個輸出中,詳細記錄了在傳輸過程中,每個階段的傳輸延時和丟包率,在UDP應用中隨着傳輸數據的增大,丟包率和延時也隨之增加。對於延時和丟包可以通過改變應用程序來緩解或修復,例如視頻流應用,可以通過緩存數據的方式而可以容忍更大的延時。
四、出錯處理
錯誤:
iperf3: error - unable to read from stream socket: No route to host
是防火牆默認關閉了 icmp
需要將客戶端和服務端的防火牆 將
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
刪掉或註釋掉即可。
五、windows與linux使用 iperf注意事項
windows與linux使用iperf打流時,需要增加-w的參數,否則會影響測試的吞吐量
另外iperf3, server端直接-s即可,無需增加額外的參數
iperf3 -s
如果想增加-w的參數,只在client端增加即可
iperf3 -c 192.168.0.100 -w 16M -i 1 -P 5 -B 192.168.0.10 -t 10
其中:
-w: --window #[KMG] set window size / socket buffer size
-i: 上報時間間隔
-P: 線程數
-B: 監聽本機的IP
-t: 測試時間
-c: 服務端的IP
iperf3使用幫助說明
Usage: iperf [-s|-c host] [options]
iperf [-h|--help] [-v|--version]
Server or Client:
-p, --port # server port to listen on/connect to
-f, --format [kmgKMG] format to report: Kbits, Mbits, KBytes, MBytes
-i, --interval # seconds between periodic bandwidth reports
-F, --file name xmit/recv the specified file
-A, --affinity n/n,m set CPU affinity
-B, --bind <host> bind to a specific interface
-V, --verbose more detailed output
-J, --json output in JSON format
-d, --debug emit debugging output
-v, --version show version information and quit
-h, --help show this message and quit
Server specific:
-s, --server run in server mode
-D, --daemon run the server as a daemon
-1, --one-off handle one client connection then exit
Client specific:
-c, --client <host> run in client mode, connecting to <host>
-u, --udp use UDP rather than TCP
-b, --bandwidth #[KMG][/#] target bandwidth in bits/sec (0 for unlimited)
(default 1 Mbit/sec for UDP, unlimited for TCP)
(optional slash and packet count for burst mode)
-t, --time # time in seconds to transmit for (default 10 secs)
-n, --bytes #[KMG] number of bytes to transmit (instead of -t)
-k, --blockcount #[KMG] number of blocks (packets) to transmit (instead of -t or -n)
-l, --len #[KMG] length of buffer to read or write
(default 128 KB for TCP, 8 KB for UDP)
-P, --parallel # number of parallel client streams to run
-R, --reverse run in reverse mode (server sends, client receives)
-w, --window #[KMG] set window size / socket buffer size
-C, --linux-congestion <algo> set TCP congestion control algorithm (Linux only)
-M, --set-mss # set TCP maximum segment size (MTU - 40 bytes)
-N, --nodelay set TCP no delay, disabling Nagle's Algorithm
-4, --version4 only use IPv4
-6, --version6 only use IPv6
-S, --tos N set the IP 'type of service'
-L, --flowlabel N set the IPv6 flow label (only supported on Linux)
-Z, --zerocopy use a 'zero copy' method of sending data
-O, --omit N omit the first n seconds
-T, --title str prefix every output line with this string
--get-server-output get results from server
[KMG] indicates options that support a K/M/G suffix for kilo-, mega-, or giga-
iperf3 homepage at: http://software.es.net/iperf/
Report bugs to: https://github.com/esnet/iperf