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 的運作基於客戶端和伺服器之間的資料傳輸。

  1. 啟動伺服器: 在一台主機上啟動 iperf3 伺服器模式 (iperf3 -s)。伺服器會監聽指定的網路連接埠(預設為 5201),等待客戶端的連接。
  2. 啟動客戶端: 在另一台主機上啟動 iperf3 客戶端模式 (iperf3 -c <server_ip>),並指定伺服器的 IP 位址。
  3. 建立連接: 客戶端會嘗試連接到指定的伺服器和連接埠。
  4. 資料傳輸:
    • TCP 測試 (預設): 客戶端向伺服器傳送資料(或在反向模式下,伺服器向客戶端傳送資料)。iperf3 會測量在指定時間內或傳輸指定資料量時的平均傳輸速率。
    • UDP 測試 (-u): 客戶端以指定的速率向伺服器傳送 UDP 封包。伺服器會接收這些封包,並統計接收到的封包數量、遺失的封包數量以及封包到達時間的抖動。
  5. 結果報告: 測試完成後,客戶端和伺服器都會顯示測試結果,包括傳輸速率、傳輸總量、以及 UDP 測試中的封包遺失和抖動。

安裝 iperf3

iperf3 的安裝方式因作業系統而異:

  • Linux (Debian/Ubuntu):

    1
    2
    sudo apt update  
    sudo apt install iperf3
  • Linux (CentOS/RHEL/Fedora):

    1
    2
    3
    4
    sudo yum install epel-release  # 如果尚未安裝 EPEL  
    sudo yum install iperf3
    # 或者使用 dnf
    sudo dnf install iperf3
  • macOS (使用 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
客戶端

在作為客戶端的主機上執行以下命令,並將替換為伺服器的實際 IP 位址:

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
11
Connecting 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
11
Connecting 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
2
3
4
5
6
  iperf3 -s -B 192.168.1.100
```

#### 客戶端綁定 IP
```bash
iperf3 -c <server_ip> -B 192.168.1.101

設定 CPU 親和性 (-A):

在多核心系統上,可以使用 -A <cpu_num> 將 iperf3 程序綁定到特定的 CPU 核心,這有助於在某些情況下獲得更一致的測試結果。

取得伺服器端輸出 (--get-server-output):

通常情況下,客戶端只顯示其自身的測試結果。使用此選項,客戶端也會顯示伺服器端的測試結果摘要。

1
iperf3 -c <server_ip> --get-server-output

記錄到檔案 (--logfile):

將測試日誌輸出到檔案而不是標準輸出。

1
2
iperf3 -c <server_ip> --logfile client_test.log
iperf3 -s --logfile server_test.log

常見應用場景

  1. 測量最大網路吞吐量:
    這是 iperf3 最基本的用途,用於了解兩點之間網路的最大資料傳輸能力。
  2. 診斷網路瓶頸:
    透過在網路路徑的不同區段進行測試 (例如,客戶端到交換器,交換器到路由器,路由器到伺服器),可以幫助定位造成效能低落的瓶頸點。
  3. 測試 Wi-Fi 效能:
    評估無線存取點 (AP) 和無線客戶端之間的實際傳輸速率,找出訊號干擾或設定問題。
  4. 驗證 QoS (Quality of Service) 設定:
    檢查 QoS 策略是否按預期工作,例如,高優先順序流量是否獲得了保證的頻寬。
  5. 比較網路變更前後的效能:
    在進行網路升級、更換設備或調整設定後,使用 iperf3 進行前後對比測試,以量化變更帶來的影響。
  6. 測試防火牆和網路安全設備的效能:
    了解防火牆或入侵檢測/防禦系統 (IDS/IPS) 在處理大量流量時對網路效能的影響。
  7. 雲端環境網路效能測試:
    測試虛擬機器之間或本地到雲端環境的網路連線品質。

使用 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 伺服器通訊,反之亦然)。

特性iperf2iperf3
主要目標頻寬測試頻寬測試,更易用,更小的程式碼庫
程式碼庫較舊,功能較多但可能較複雜重新編寫,更現代,更精簡
JSON 輸出不支援 (或透過第三方補丁)內建支援 (-J)
零複製支援支援 (-Z)
執行緒模型每個串流一個執行緒單執行緒 (通常情況下),非同步 I/O
雙向測試-d 選項支援同時雙向支援 --bidir (客戶端發起同時雙向),或分別執行 -R
API提供 C++ API提供 C API (libiperf)
社群支援仍有使用者,但更新較少活躍開發和維護
報告文字報告文字報告,JSON 報告

一般來說,對於新的測試,建議使用 iperf3,因為它更易於使用,並且持續獲得更新和支援。

結論

iperf3 是一個不可或缺的網路效能測試工具。它簡單易用,功能強大,能夠提供關於網路頻寬、抖動和封包遺失的寶貴數據。無論是網路管理員、系統工程師還是普通使用者,都可以利用 iperf3 來評估和最佳化其網路環境,確保網路連接的品質和效率。透過理解其各種選項和最佳實踐,使用者可以更有效地利用 iperf3 來解決實際的網路問題。

也許你也會想看看