4. 带宽测试工具

说到带宽测试,我第一个想到的工具就是 iPerf3。这玩意儿我用了快十年了,从 iPerf2 一路跟到 iPerf3,中间踩过的坑能写满一页纸。说白了,它就是网络工程师的「万用表」——简单、直接、靠谱。

你可能会问:为什么不用 Speedtest 或者别的什么工具?嗯,那些工具测的是「到互联网的带宽」,而 iPerf3 测的是「任意两点之间的带宽」。你想想看,排查内网问题的时候,你关心的是到公网的速度吗?显然不是。你要的是 A 到 B 的真实吞吐量。

4.1 iPerf3 的安装:三分钟搞定

安装这事儿,我习惯分平台来说。别嫌啰嗦,我在项目里见过太多因为装错版本导致测试结果离谱的案例。

Linux 系统(CentOS / Ubuntu)

# CentOS / RHEL
sudo yum install epel-release -y
sudo yum install iperf3 -y

# Ubuntu / Debian
sudo apt update
sudo apt install iperf3 -y

这里有个坑:CentOS 默认源里没有 iperf3,必须装 EPEL。我曾经在一台刚装好的 CentOS 7 上直接 yum install iperf3,结果告诉我「没有可用软件包」。当时我还纳闷呢,后来才想起来 EPEL 没装。嗯,这种低级错误犯过一次就够了。

Windows 系统

去官网下载二进制包,或者直接用 Chocolatey:

choco install iperf3

我个人习惯把 iperf3.exe 扔到 C:\Windows\System32 目录下,这样命令行里直接就能调用了。省得每次都要 cd 到安装目录,麻烦。

macOS 系统

brew install iperf3

装完之后,验证一下:

iperf3 --version

看到版本号就说明装好了。如果报错,大概率是环境变量没配好,检查一下 PATH。

4.2 基础使用:服务端与客户端模式

iPerf3 的工作模式很简单:一台机器当服务器,另一台当客户端。服务器监听端口,客户端发起连接并发送数据。

先启动服务端:

iperf3 -s

默认监听 5201 端口。如果你想用别的端口:

iperf3 -s -p 5001

然后客户端连上去:

iperf3 -c 192.168.1.100

就这么简单。几秒钟后,你会看到类似这样的输出:

- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.00  sec  1.10 GBytes   945 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -

看到 945 Mbits/sec 这个数字了吗?这说明你的千兆链路基本跑满了。如果只有 300 多,那就要开始排查了——是网线问题?交换机端口协商不对?还是中间有瓶颈?

小技巧: 我习惯在服务端加上 -i 1 参数,让结果每秒输出一次。这样能看出带宽的波动情况,而不是只看一个平均值。

4.3 TCP 模式测试:最常用的场景

TCP 模式是默认的,也是我工作中用得最多的。它模拟的是真实应用的数据传输行为——有确认、有重传、有拥塞控制。

常用的参数组合:

# 客户端:测试 30 秒,每 1 秒输出一次
iperf3 -c 192.168.1.100 -t 30 -i 1

# 反向测试(服务器向客户端发数据)
iperf3 -c 192.168.1.100 -t 30 -i 1 -R

# 指定并行流数(模拟多连接场景)
iperf3 -c 192.168.1.100 -t 30 -P 4

为什么要用 -R?因为很多时候链路是不对称的。比如你公司的出口带宽,下载 1000M,上传可能只有 100M。只测一个方向,你只能看到一半的真相。

至于 -P 参数,我在项目中遇到过这样一个案例:某次测试单流只能跑 200Mbps,但加上 -P 4 之后直接飙到 800Mbps。这说明什么?说明瓶颈不在带宽,而在 TCP 的窗口大小或者 CPU 的处理能力。多流并行能绕过这些限制,看到链路的真实上限。

注意: 并行流数不是越大越好。我曾经试过 -P 32,结果 CPU 被打满了,带宽反而下降了。一般来说,4 到 8 个流就够用了。

4.4 UDP 模式测试:看丢包和抖动

TCP 模式测的是「可靠传输」的带宽,而 UDP 模式测的是「尽力而为」的带宽。说白了,UDP 模式能告诉你:如果我不在乎丢包,这条链路到底能塞多少数据?

启动 UDP 模式:

# 服务端
iperf3 -s

# 客户端:指定带宽 100Mbps
iperf3 -c 192.168.1.100 -u -b 100M

输出结果里,我最关注三个指标:

  • Jitter(抖动):延迟的变化量。VoIP 和视频会议对抖动特别敏感,超过 30ms 基本就没法用了。
  • Lost/Total Datagrams(丢包率):这个不用多说,丢包多了什么应用都白搭。
  • 实际吞吐量:发送端声称发了 100M,但接收端只收到了 80M,那剩下的 20M 就是被网络吃掉了。

举个例子:

[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams
[  5]   0.00-10.00  sec  113 MBytes   94.8 Mbits/sec  0.023 ms  0/81048 (0%)

丢包率为 0%,抖动 0.023ms,这说明链路质量非常好。但如果看到这样的结果:

[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams
[  5]   0.00-10.00  sec  89.3 MBytes  75.0 Mbits/sec  5.234 ms  1421/65421 (2.2%)

丢包 2.2%,抖动 5ms——嗯,这条链路有问题。可能是带宽不够,也可能是中间设备在处理大流量时出现了瓶颈。

核心思路: UDP 测试的关键是「逐步加压」。我从 100M 开始,每次加 50M,直到出现明显丢包。那个临界点,就是这条链路的实际承载能力。

4.5 常见参数速查表

参数 说明 示例
-s 服务端模式 iperf3 -s
-c 客户端模式,指定服务器 IP iperf3 -c 10.0.0.1
-u UDP 模式 iperf3 -c 10.0.0.1 -u
-b UDP 目标带宽 iperf3 -c 10.0.0.1 -u -b 500M
-t 测试时长(秒) iperf3 -c 10.0.0.1 -t 60
-i 输出间隔(秒) iperf3 -c 10.0.0.1 -i 1
-P 并行流数 iperf3 -c 10.0.0.1 -P 4
-R 反向测试 iperf3 -c 10.0.0.1 -R
-p 指定端口 iperf3 -s -p 5001

4.6 避坑指南

最后,分享几个我踩过的坑:

  • 防火墙没关:我曾经在客户现场折腾了半小时,结果发现是 Windows 防火墙把 5201 端口拦了。记得先放行端口,或者直接关防火墙测试。
  • 服务端版本不一致:iPerf3 的 3.0 和 3.1 在某些参数上不兼容。我建议两端用完全相同的版本,省得出幺蛾子。
  • 测试时间太短:默认 10 秒的测试,对于 TCP 的慢启动阶段来说可能不够。尤其是高延迟链路,10 秒可能还没进入稳态。我一般至少测 30 秒。
  • 忽略了 CPU 瓶颈:如果测试时 CPU 跑到 100%,那测出来的带宽就不是网络瓶颈,而是 CPU 瓶颈了。用 top 或任务管理器看一眼,确保 CPU 有余量。

好了,iPerf3 的基础使用就讲到这里。工具本身不复杂,但怎么用好它,怎么从结果里读出问题,这才是真功夫。下一节我们会聊更高级的用法——比如双向测试、JSON 输出、以及如何用 iPerf3 做长时间的稳定性测试。