iperf
/ EYE-perf /
ping 告訴你單一一則小訊息回來得多快,但它對於你實際上能透過一條路徑灌入多少資料卻什麼都沒說。要知道那個,你得試著搬移大量資料,看它跑得多快——就像計時你能多快把一整桶水倒過一根管子,而不只是滴入一滴染色劑做記號。iperf 正是做這件事的標準工具:對你所掌控的兩台機器之間「可達成的吞吐量」做主動量測。
它以一對的方式運作。你在一台機器上以伺服器模式執行 iperf,在另一台上以用戶端模式執行,並指向伺服器。接著用戶端會在固定時間內(預設數秒)以這條路徑允許的最快速度送資料,兩端都報告達成的速率(位元/秒)。用 TCP 時,iperf 量的是一條真實、守規矩的 TCP 連線能維持的吞吐量——包含壅塞控制、往返時間與頻寬延遲乘積的影響。用 UDP 時,你改為設定一個目標送出速率,iperf 則報告到了多少、遺失多少、抖動(jitter)多少,這對測試一條連結能否承載例如一段視訊串流很有用。
對 iperf 在告訴你什麼、不告訴你什麼要誠實。它量的是吞吐量,也就是在這些條件下你實際達成的速率,而不是頻寬,也就是連結的原始容量——而結果非常仰賴路徑、時段、TCP 設定,以及兩個端點的 CPU。因為它刻意試圖把路徑灌滿,iperf 是會造成干擾的:在正式線路上跑它可能短暫餓死真實使用者,所以最好在閒置連結或維護時段執行。它也要求你掌控兩端,這就是為什麼它量的是你那兩台機器之間的網路,而不是某個任意網站的速度。
在一台伺服器上你執行「iperf3 -s」;在一台筆電上你執行「iperf3 -c server」。十秒後筆電印出大約「[ID] 0.00-10.00 sec 1.10 GBytes 941 Mbits/sec」。那個 941 Mbps 是一條 TCP 連線跨越這條路徑所達成的吞吐量——逼近 gigabit 乙太網路連結的上限,而不是連結標稱的 1 Gbps。
iperf 量的是你所掌控的兩台機器之間可達成的吞吐量——在 1 Gbps 連結上得到 941 Mbps,一旦算進標頭與協定開銷便屬正常。
iperf 量的是吞吐量,不是頻寬:在 1 Gbps 連結上得到 941 Mbps,扣掉標頭與協定開銷後屬正常。因為它刻意把路徑灌滿,絕不要隨手在繁忙的正式線路上執行它。