4. 吞吐量测试:使用 iperf3 进行 TCP/UDP 吞吐量测试,理解带宽与窗口大小关系
吞吐量测试,说白了就是看看你的网络到底能跑多快。我刚开始做通信系统测试那会儿,总觉得这玩意儿很简单——不就是发数据、收数据、算速率嘛。直到有一次在数据中心做压力测试,发现千兆网卡死活只能跑到 300Mbps,排查了三天才发现是 TCP 窗口大小没调对。嗯,从那以后我再也不敢小看这个测试了。
今天咱们就用 iperf3 这个工具,把 TCP 和 UDP 的吞吐量测试彻底搞明白。你想想看,如果连自己的网络能跑多快都不清楚,后面做系统调优那就是盲人摸象。
4.1 iperf3 基础用法
iperf3 是目前最主流的网络吞吐量测试工具。我个人习惯把它装在测试链路的两端——一台当服务器,一台当客户端。安装很简单,Linux 上直接 apt install iperf3 或者 yum install iperf3 就行。
先看最基本的 TCP 测试:
# 服务端(IP: 192.168.1.100)
iperf3 -s
# 客户端
iperf3 -c 192.168.1.100
跑完之后你会看到类似这样的输出:
[ ID] Interval Transfer Bitrate
[ 5] 0.00-10.00 sec 1.10 GBytes 945 Mbits/sec sender
[ 5] 0.00-10.00 sec 1.10 GBytes 945 Mbits/sec receiver
这里 945 Mbits/sec 就是 TCP 吞吐量。注意看,发送端和接收端的数据量基本一致,说明没有丢包。如果接收端明显少于发送端,那就要小心了——网络可能有瓶颈。
-t 30 参数把时间拉长到 30 秒。短时间测试容易受突发流量影响,数据不够稳定。我在项目中吃过这个亏,10 秒测试看着挺好,一上线跑业务就崩。
4.2 TCP 窗口大小与带宽的关系
这里有个核心概念你必须理解——TCP 窗口大小决定了你能跑多快。为什么会这样?
TCP 是可靠传输协议,发送方发出去的数据,必须等接收方确认(ACK)之后才能继续发。窗口大小就是「不需要等待确认就能连续发送的数据量」。窗口越大,管道里能塞的数据就越多,吞吐量自然就上去了。
理论上有条公式:
最大吞吐量 = 窗口大小 / RTT(往返时延)
举个例子:如果 RTT 是 10ms,窗口大小是 64KB,那最大吞吐量就是 64KB / 0.01s = 6.4MB/s ≈ 51.2Mbps。想跑到 1Gbps?窗口至少得 1.25MB。
用 iperf3 测试不同窗口大小的影响:
# 客户端指定窗口大小(Linux 上单位是字节)
iperf3 -c 192.168.1.100 -w 64K
iperf3 -c 192.168.1.100 -w 256K
iperf3 -c 192.168.1.100 -w 1M
我在一次跨国链路测试中遇到过这种情况:默认窗口下只能跑 20Mbps,把窗口调到 4MB 之后直接飙到 200Mbps。你想想看,差了整整 10 倍!
| 窗口大小 | RTT 10ms | RTT 50ms | RTT 100ms |
|---|---|---|---|
| 64KB | 51.2 Mbps | 10.2 Mbps | 5.1 Mbps |
| 256KB | 204.8 Mbps | 41.0 Mbps | 20.5 Mbps |
| 1MB | 838.9 Mbps | 167.8 Mbps | 83.9 Mbps |
| 4MB | 3.3 Gbps | 671.1 Mbps | 335.5 Mbps |
看到没?高延迟链路对窗口大小的敏感度极高。这也是为什么卫星通信、跨国专线这类场景特别需要调窗口参数。
4.3 UDP 吞吐量测试
UDP 测试和 TCP 不太一样。UDP 不关心可靠性,它只管发。所以 iperf3 的 UDP 测试需要你手动指定带宽目标:
# 服务端
iperf3 -s
# 客户端,尝试发送 100Mbps 的 UDP 流量
iperf3 -c 192.168.1.100 -u -b 100M
输出结果会告诉你实际发了多少、收到了多少、丢包率是多少:
[ ID] Interval Transfer Bitrate Jitter Lost/Total Datagrams
[ 5] 0.00-10.00 sec 119 MBytes 100 Mbits/sec 0.003 ms 0/15238 (0%)
[ 5] 0.00-10.00 sec 119 MBytes 100 Mbits/sec 0.004 ms 0/15238 (0%)
如果丢包率超过 0.1%,说明网络已经扛不住了。我在视频流媒体项目中就用这个方法找到了链路的极限带宽——逐步增加 -b 参数,直到丢包率开始飙升。
UDP 测试还有个重要指标叫 Jitter(抖动)。它衡量的是数据包到达时间的稳定性。实时通信场景(比如 VoIP、视频会议)对 Jitter 很敏感,一般要求低于 20ms。
# 测试不同带宽下的 Jitter 变化
iperf3 -c 192.168.1.100 -u -b 50M
iperf3 -c 192.168.1.100 -u -b 200M
iperf3 -c 192.168.1.100 -u -b 500M
4.4 多流并发测试
真实业务场景中,很少只有一个连接在跑。我习惯用 iperf3 的并行流参数模拟多用户场景:
# 4 个并行流
iperf3 -c 192.168.1.100 -P 4
# 10 个并行流
iperf3 -c 192.168.1.100 -P 10
你会看到每个流的独立统计和汇总统计。多流测试有个好处——它能暴露单流无法达到的瓶颈。比如单流只能跑 500Mbps,但 4 流加起来能跑 1.8Gbps,说明瓶颈在单连接层面(可能是 CPU 中断处理、也可能是窗口限制)。
我曾经帮一个客户排查问题,他们的应用只用单连接传输大文件,死活跑不满带宽。我建议改成多连接并发,性能直接翻倍。有时候问题不在网络,而在应用的设计上。
4.5 反向测试与双向测试
默认情况下 iperf3 是从客户端往服务端发数据。但实际网络往往是非对称的——下载和上传性能不一样。用 -R 参数做反向测试:
# 服务端到客户端方向
iperf3 -c 192.168.1.100 -R
双向测试用 --bidir:
# 同时测试两个方向
iperf3 -c 192.168.1.100 --bidir
我在运营商网络测试中发现过不少案例:下行能跑 900Mbps,上行只有 300Mbps。如果不做双向测试,你根本发现不了这个问题。
4.6 测试结果解读与常见问题
跑完测试拿到数据,怎么判断正不正常?我一般看这几个点:
- 吞吐量 vs 带宽上限: 如果千兆网卡只跑出 200Mbps,肯定有问题
- 发送 vs 接收: 差值超过 5% 就要排查丢包
- CPU 占用率: iperf3 本身很轻量,如果 CPU 跑满说明瓶颈在主机
- 多流 vs 单流: 多流能提升说明单连接有限制
常见问题排查思路:
- 吞吐量上不去 → 检查窗口大小、RTT、CPU 负载
- UDP 丢包严重 → 降低发送速率或检查交换机缓冲区
- 双向测试不对称 → 检查链路协商模式、网卡驱动
- 多流反而下降 → 可能是 CPU 软中断瓶颈
4.7 知识体系总结
这一章的内容比较多,我画了张图帮你梳理核心逻辑:
这张图把本章的核心知识点串起来了。TCP 测试关注窗口和 RTT,UDP 测试关注丢包和 Jitter,多流测试用来排查单连接瓶颈。三个方向最终都指向同一个目标——找到网络的真实极限。
好了,这一章的内容就到这里。记住,吞吐量测试不是跑一次就完事的。不同时间、不同负载、不同参数下,结果可能天差地别。多测几次,取平均值,再结合业务场景分析,才能真正摸清你网络的底细。
公众号:蓝海资料掘金营,微信deep3321