iperf3 網路效能測試工具
iperf3 是一款強大的開源網路效能測試工具,廣泛用於測量 IP 網路上的最大可達到頻寬。
最近在建置跨地區的 K8s 叢集時,剛好有機會需要驗證公司內部的專線品質,所以就使用 iperf3 進行測試、評估網路狀態與效能。
本篇文章將教學 iperf3 的基本使用方法、常見參數以及如何在不同環境中進行測試。
iperf3 的核心功能
- 支援 TCP 和 UDP 測試:
- TCP: 測量傳輸控制協定 (Transmission Control Protocol) 的頻寬。TCP 提供可靠的、面向連接的傳輸服務,適用於大多數網路應用。
- UDP: 測量使用者資料包協定 (User Datagram Protocol) 的頻寬。UDP 提供不可靠的、無連接的傳輸服務,適用於對即時性要求較高或可以容忍少量封包遺失的應用(如串流媒體、線上遊戲)。測試 UDP 時,iperf3 還可以報告抖動 (jitter) 和封包遺失率。
- 客戶端-伺服器架構: iperf3 採用客戶端-伺服器模型。一台機器執行 iperf3 伺服器,另一台機器執行 iperf3 客戶端,客戶端向伺服器發起連接並傳輸資料。
- 可調整的測試參數: 使用者可以自訂多種測試參數,例如測試持續時間、傳輸資料量、平行串流數量、TCP 視窗大小、UDP 頻寬等。
- 雙向測試: 可以測試上傳和下載頻寬。
- 詳細的報告: 提供即時的測試結果,包括傳輸速率、傳輸資料量、封包遺失 (UDP)、抖動 (UDP) 等。
- JSON 格式輸出: 支援將測試結果輸出為 JSON 格式,方便程式解析和整合。
- 跨平台支援: 可在多種作業系統上執行,包括 Linux、Windows、macOS、FreeBSD 等。
- 零複製 (Zero-copy) 模式: 在支援的系統上,可以使用
-Z
選項啟用零複製模式,減少 CPU 使用率,更準確地測量網路本身的效能。
iperf3 如何運作
iperf3 的運作基於客戶端和伺服器之間的資料傳輸。
- 啟動伺服器: 在一台主機上啟動 iperf3 伺服器模式 (
iperf3 -s
)。伺服器會監聽指定的網路連接埠(預設為 5201),等待客戶端的連接。 - 啟動客戶端: 在另一台主機上啟動 iperf3 客戶端模式 (
iperf3 -c <server_ip>
),並指定伺服器的 IP 位址。 - 建立連接: 客戶端會嘗試連接到指定的伺服器和連接埠。
- 資料傳輸:
- TCP 測試 (預設): 客戶端向伺服器傳送資料(或在反向模式下,伺服器向客戶端傳送資料)。iperf3 會測量在指定時間內或傳輸指定資料量時的平均傳輸速率。
- UDP 測試 (
-u
): 客戶端以指定的速率向伺服器傳送 UDP 封包。伺服器會接收這些封包,並統計接收到的封包數量、遺失的封包數量以及封包到達時間的抖動。
- 結果報告: 測試完成後,客戶端和伺服器都會顯示測試結果,包括傳輸速率、傳輸總量、以及 UDP 測試中的封包遺失和抖動。
安裝 iperf3
iperf3 的安裝方式因作業系統而異:
Linux (Debian/Ubuntu):
1
2sudo apt update
sudo apt install iperf3Linux (CentOS/RHEL/Fedora):
1
2
3
4sudo yum install epel-release # 如果尚未安裝 EPEL
sudo yum install iperf3
# 或者使用 dnf
sudo dnf install iperf3macOS (使用 Homebrew):
1
brew install iperf3
Windows:
可以從 iperf3 官方網站 (https://iperf.fr/iperf-download.php) 下載預編譯的執行檔。下載後解壓縮,即可在命令提示字元 (cmd) 或 PowerShell 中執行 iperf3.exe。建議將其路徑加入系統的 PATH 環境變數中,方便使用。
基本使用方法
在作為伺服器的主機上執行以下命令:1
iperf3 -s
這會啟動 iperf3 伺服器,並在預設連接埠 5201 上監聽。
常用伺服器選項:
-s
或--server
:以伺服器模式執行。-p <port>
或--port <port>
:指定伺服器監聽的連接埠(預設 5201)。-i <interval>
或--interval <interval>
:設定定期頻寬報告的間隔時間(秒)。-1
或--one-off
:僅處理一個客戶端連接,然後退出。-D
或--daemon
:以背景程式 (daemon) 模式執行。
範例:
啟動伺服器
1 | iperf3 -s |
客戶端
在作為客戶端的主機上執行以下命令,並將1
iperf3 -c <server_ip>
這會啟動 iperf3 客戶端,連接到指定的伺服器,並執行預設的 TCP 測試(持續 10 秒)。
常用客戶端選項:
-c <host>
或--client <host>
:以客戶端模式執行,並指定要連接的伺服器主機。-p <port>
或--port <port>
:指定要連接的伺服器連接埠(預設 5201)。-t <time>
或--time <time>
:測試持續時間(秒,預設 10 秒)。-n <bytes>
或--bytes <bytes>
:要傳輸的資料總量 (例如 100M, 2G)。-b <bits/sec>
或--bitrate <bits/sec>
:UDP 模式下的目標頻寬 (例如 10M, 1G)。TCP 模式下此選項無效,因為 TCP
會嘗試使用所有可用頻寬。-l <length>
或--length <length>
:讀寫緩衝區的大小 (TCP 預設 128KB,UDP 預設 8KB)。-P <num>
或--parallel <num>
:平行執行的客戶端串流數量。-u
或--udp
:使用 UDP 協定進行測試。-R
或--reverse
:反向模式,由伺服器傳送資料,客戶端接收。-i <interval>
或--interval <interval>
:設定定期頻寬報告的間隔時間(秒)。-J
或--json
:以 JSON 格式輸出結果。-Z
或--zerocopy
:使用零複製方法傳送資料 (如果支援)。-O <sec>
或--omit <sec>
:忽略測試開始的前 N 秒。--get-server-output
:從伺服器獲取測試結果。--cport <port>
:指定客戶端使用的來源連接埠。
範例:
連接到 IP 為 192.168.1.100 的伺服器,進行預設 TCP 測試
1 | iperf3 -c 192.168.1.100 |
進行 30 秒的 TCP 測試
1 | iperf3 -c 192.168.1.100 -t 30 |
進行 UDP 測試,目標頻寬為 100 Mbps,持續 20 秒
1 | iperf3 -c 192.168.1.100 -u -b 100M -t 20 |
進行 TCP 反向測試 (伺服器傳送,客戶端接收)
1 | iperf3 -c 192.168.1.100 -R |
進行 4 個平行串流的 TCP 測試
1 | iperf3 -c 192.168.1.100 -P 4 |
進行 TCP 測試並將結果輸出為 JSON 格式
1 | iperf3 -c 192.168.1.100 -J |
解讀基本輸出
TCP 測試輸出範例 (客戶端):1
2
3
4
5
6
7
8
9
10
11Connecting to host 192.168.1.100, port 5201
[ 5] local 192.168.1.101 port 53212 connected to 192.168.1.100 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 110 MBytes 923 Mbits/sec 0 1.20 MBytes
[ 5] 1.00-2.00 sec 112 MBytes 940 Mbits/sec 0 1.35 MBytes
...
[ 5] 9.00-10.00 sec 112 MBytes 938 Mbits/sec 0 1.80 MBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 1.09 GBytes 937 Mbits/sec 0 sender
[ 5] 0.00-10.04 sec 1.09 GBytes 933 Mbits/sec receiver
- Interval: 報告的時間間隔。
- Transfer: 在該時間間隔內傳輸的資料量。
- Bitrate: 在該時間間隔內的平均傳輸速率。
- Retr: TCP 重傳的區段數量 (越少越好)。
- Cwnd: TCP 擁塞視窗大小。
- sender 是客戶端測量的傳送速率。receiver 行顯示的是遠端 (通常是伺服器) 測量的接收速率。如果使用了
-R
(反向模式),則 sender 是伺服器端的傳送速率,receiver 是客戶端測量的接收速率。使用--get-server-output
選項可以在客戶端同時看到伺服器端的 sender/receiver 摘要。
UDP 測試輸出範例 (客戶端):1
2
3
4
5
6
7
8
9
10
11Connecting to host 192.168.1.100, port 5201
[ 5] local 192.168.1.101 port 54321 connected to 192.168.1.100 port 5201
[ ID] Interval Transfer Bitrate Jitter Lost/Total Datagrams
[ 5] 0.00-1.00 sec 11.9 MBytes 100 Mbits/sec 0.025 ms 0/8502 (0%)
[ 5] 1.00-2.00 sec 11.9 MBytes 100 Mbits/sec 0.015 ms 0/8501 (0%)
...
[ 5] 9.00-10.00 sec 11.9 MBytes 100 Mbits/sec 0.020 ms 0/8501 (0%)
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Jitter Lost/Total Datagrams
[ 5] 0.00-10.00 sec 119 MBytes 100 Mbits/sec 0.020 ms 0/85010 (0%) sender
[ 5] 0.00-10.00 sec 119 MBytes 100 Mbits/sec 0.018 ms 0/85008 (0%) receiver
- Jitter: 封包延遲的變化,即封包到達時間的標準差 (越小越好)。
- Lost/Total Datagrams: 遺失的 UDP 封包數量與總共傳送的封包數量,以及遺失百分比 (越低越好)。
進階選項與技巧
平行串流 (-P
):
使用 -P <num>
可以模擬多個應用程式同時傳輸資料的情況,有助於測試網路能否處理多個並行連接,並可能達到更高的總頻寬,尤其是在高延遲網路上。1
iperf3 -c <server_ip> -P 8
反向模式 (-R
):
預設情況下,客戶端傳送資料,伺服器接收。使用 -R
選項可以反轉這個方向,由伺服器傳送資料,客戶端接收。這對於測試下載速度非常有用。1
iperf3 -c <server_ip> -R
雙向同時測試 (--bidir
):
與 iperf2 的 -d
選項類似,iperf3 客戶端可以使用 --bidir
選項來同時進行上傳和下載的頻寬測試。當客戶端使用此選項時,它會先進行正常的上傳測試,然後伺服器會自動啟動一個反向的流量傳輸給客戶端。1
iperf3 -c <server_ip> --bidir
這會先顯示客戶端到伺服器的傳輸數據,接著顯示伺服器到客戶端的傳輸數據。如果需要分別測試上傳和下載,仍然可以使用以下方式:
測試上傳
1 | iperf3 -c <server_ip> |
測試下載
1 | iperf3 -c <server_ip> -R |
設定 TCP 視窗大小 (-w
):
TCP 視窗大小會影響長距離高頻寬網路 (Long Fat Networks, LFNs) 的效能。在某些情況下,調整視窗大小 (-w <size>
, 例如 -w 2M
) 可能有助於達到更高的吞吐量。不過,現代作業系統通常具有良好的 TCP 自動調整機制,手動設定可能不是必需的。
綁定特定 IP 位址 (-B
):
如果主機擁有多個網路介面卡或 IP 位址,可以使用 -B <ip_address>
選項將 iperf3 綁定到特定的 IP 位址進行測試。
伺服器端綁定 IP
1 | iperf3 -s -B 192.168.1.100 |
設定 CPU 親和性 (-A
):
在多核心系統上,可以使用 -A <cpu_num>
將 iperf3 程序綁定到特定的 CPU 核心,這有助於在某些情況下獲得更一致的測試結果。
取得伺服器端輸出 (--get-server-output
):
通常情況下,客戶端只顯示其自身的測試結果。使用此選項,客戶端也會顯示伺服器端的測試結果摘要。1
iperf3 -c <server_ip> --get-server-output
記錄到檔案 (--logfile
):
將測試日誌輸出到檔案而不是標準輸出。1
2iperf3 -c <server_ip> --logfile client_test.log
iperf3 -s --logfile server_test.log
常見應用場景
- 測量最大網路吞吐量:
這是 iperf3 最基本的用途,用於了解兩點之間網路的最大資料傳輸能力。 - 診斷網路瓶頸:
透過在網路路徑的不同區段進行測試 (例如,客戶端到交換器,交換器到路由器,路由器到伺服器),可以幫助定位造成效能低落的瓶頸點。 - 測試 Wi-Fi 效能:
評估無線存取點 (AP) 和無線客戶端之間的實際傳輸速率,找出訊號干擾或設定問題。 - 驗證 QoS (Quality of Service) 設定:
檢查 QoS 策略是否按預期工作,例如,高優先順序流量是否獲得了保證的頻寬。 - 比較網路變更前後的效能:
在進行網路升級、更換設備或調整設定後,使用 iperf3 進行前後對比測試,以量化變更帶來的影響。 - 測試防火牆和網路安全設備的效能:
了解防火牆或入侵檢測/防禦系統 (IDS/IPS) 在處理大量流量時對網路效能的影響。 - 雲端環境網路效能測試:
測試虛擬機器之間或本地到雲端環境的網路連線品質。
使用 iperf3 的技巧與最佳實踐
- 選擇合適的測試時間: 避免在網路尖峰時段進行測試,除非你的目的就是測試尖峰時段的效能。
- 足夠的測試持續時間: 對於 TCP 測試,建議至少持續 30-60 秒,以便 TCP 演算法有足夠時間達到穩定狀態。
- 了解硬體限制: 測試結果可能會受到主機 CPU、記憶體、網路卡能力的限制,而不僅僅是網路本身。
- 注意防火牆: 確保客戶端和伺服器之間的防火牆允許 iperf3 使用的連接埠 (預設 5201) 通訊。
- 雙向測試: 網路路徑的上傳和下載效能可能不對稱,務必測試兩個方向。
- 考慮網路上的其他流量: 測試期間,盡量減少其他應用程式佔用網路頻寬,以獲得更準確的結果。
- 多次測試取平均值: 網路狀況可能波動,執行多次測試並取平均值可以得到更可靠的結果。
- 使用 -V (verbose) 選項: 獲取更詳細的輸出,有助於除錯。
- 理解單位: 注意報告中的單位是 Mbits/sec (Mbps) 還是 MBytes/sec (MBps)。1 MByte = 8 Mbits。
iperf3 vs iperf2
雖然 iperf3 是 iperf2 的後繼者,但它們之間存在一些關鍵差異,且兩者並不相容 (iperf2 客戶端不能與 iperf3 伺服器通訊,反之亦然)。
特性 | iperf2 | iperf3 |
---|---|---|
主要目標 | 頻寬測試 | 頻寬測試,更易用,更小的程式碼庫 |
程式碼庫 | 較舊,功能較多但可能較複雜 | 重新編寫,更現代,更精簡 |
JSON 輸出 | 不支援 (或透過第三方補丁) | 內建支援 (-J ) |
零複製 | 支援 | 支援 (-Z ) |
執行緒模型 | 每個串流一個執行緒 | 單執行緒 (通常情況下),非同步 I/O |
雙向測試 | -d 選項支援同時雙向 | 支援 --bidir (客戶端發起同時雙向),或分別執行 -R |
API | 提供 C++ API | 提供 C API (libiperf) |
社群支援 | 仍有使用者,但更新較少 | 活躍開發和維護 |
報告 | 文字報告 | 文字報告,JSON 報告 |
一般來說,對於新的測試,建議使用 iperf3,因為它更易於使用,並且持續獲得更新和支援。
結論
iperf3 是一個不可或缺的網路效能測試工具。它簡單易用,功能強大,能夠提供關於網路頻寬、抖動和封包遺失的寶貴數據。無論是網路管理員、系統工程師還是普通使用者,都可以利用 iperf3 來評估和最佳化其網路環境,確保網路連接的品質和效率。透過理解其各種選項和最佳實踐,使用者可以更有效地利用 iperf3 來解決實際的網路問題。