2、网络带宽排查:带宽测试方法、上行带宽不足的表现、如何通过工具(如 iperf)测量真实带宽

推流卡顿,十有八九跟网络带宽有关。但很多人一上来就怀疑服务器,或者怪编码器,其实最该先查的,是上行带宽。

我个人习惯,遇到推流卡顿,第一件事不是调码率,而是先跑一遍带宽测试。为什么?因为很多所谓的“卡顿”,其实是上行带宽被占满了,数据发不出去。

核心认知: 推流是实时行为,带宽不足不会像下载那样“慢慢等”,而是直接丢帧、花屏、断流。

2.1 上行带宽不足的典型表现

上行带宽不够,推流端会有一些非常明显的特征。我列几个最常见的,你看看是不是遇到过:

  • 推流端 CPU 占用不高,但编码器频频报错 —— 编码器本身没问题,是数据发不出去,缓冲区满了。
  • 播放端画面突然卡住,然后快进 —— 这叫“跳帧”,因为推流端丢了一部分数据,播放器只能跳过。
  • 推流软件显示“发送缓冲区满”或“网络抖动” —— 这是最直接的信号。
  • 上行带宽跑满,但下行带宽还有大量余量 —— 很多人只看总带宽,其实上行和下行是两条路。

嗯,这里要注意:上行带宽不足,有时候不是一直不足,而是间歇性的。比如你家里有人在看 4K 视频,或者下载大文件,上行就会被挤占。我在项目中遇到过好几次,客户说“晚上 8 点准时卡”,一查,原来是家里人都在刷抖音,上行被占满了。

避坑指南: 我曾经遇到一个案例,推流端显示带宽足够,但播放端就是卡。排查了半天,发现是路由器 QoS 没开,上行被 P2P 下载占满了。所以,别只看测速结果,还要看实时流量。

2.2 带宽测试方法:别信运营商给的数字

运营商说的“100M 宽带”,通常指的是下行。上行?很多家庭宽带的上行只有 10M 甚至更低。你想想看,推流需要的是上行,下行再快也没用。

所以,测带宽要分两步走:

  1. 测下行 —— 用 Speedtest 之类的工具,看看你家的下行到底有多少。
  2. 测上行 —— 这才是关键。很多测速工具默认只测下行,你得手动切到上行测试。

但说实话,Speedtest 这类工具测出来的结果,只能当参考。为什么?因为它的服务器通常离你很近,网络路径短,测出来的数字往往偏大。真实推流场景,你的数据要经过很多跳才能到 CDN 节点,中间可能有各种瓶颈。

我的建议: 用 Speedtest 测出“理论最大值”,然后打 7 折,作为你的实际可用带宽。比如测出来上行 20M,那你就按 14M 来规划码率。

2.3 用 iperf 测量真实带宽

如果你想要更准确的数据,那就得上 iperf。这工具是网络工程师的老朋友了,简单、直接、没花哨。

iperf 的原理很简单:客户端向服务端发送数据,服务端统计收到的数据量,然后算出实际带宽。它不像 Speedtest 那样依赖外部服务器,你可以自己搭服务端,想测哪条链路就测哪条。

2.3.1 安装 iperf

Windows、Linux、macOS 都能装。我一般用 iperf3,版本比较新,功能也够用。

# Ubuntu / Debian
sudo apt-get install iperf3

# CentOS / RHEL
sudo yum install iperf3

# macOS (Homebrew)
brew install iperf3

# Windows
# 去官网下载 exe 文件,或者用 Chocolatey
choco install iperf3

2.3.2 服务端启动

在你要测试的目标机器上(比如你的推流服务器,或者一台云主机),启动 iperf 服务端:

iperf3 -s

默认监听 5201 端口。记得在防火墙里放行这个端口。

2.3.3 客户端测试上行带宽

在推流机器上,运行以下命令:

iperf3 -c 你的服务器IP -t 30 -i 1
  • -c:指定服务端 IP
  • -t 30:测试时长 30 秒
  • -i 1:每秒打印一次结果

跑完之后,你会看到类似这样的输出:

[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-30.00  sec  56.2 MBytes  15.7 Mbits/sec  0.00
[  5]   0.00-30.00  sec  56.2 MBytes  15.7 Mbits/sec  0.00

这个 15.7 Mbits/sec 就是你的上行带宽。注意看 Retr 这一列,如果重传次数很多,说明网络质量不好,有丢包。

关键点: iperf 测的是 TCP 带宽。TCP 有拥塞控制,如果网络有丢包,它会自动降速。所以,iperf 测出来的结果,就是你实际能用的 TCP 带宽,非常接近推流场景。

2.3.4 测试 UDP 带宽(更接近推流)

推流通常用 RTMP,底层是 TCP。但如果你用 SRT 或者 WebRTC,底层是 UDP。这时候,你需要测 UDP 带宽:

# 服务端
iperf3 -s -p 5202

# 客户端
iperf3 -c 你的服务器IP -u -b 20M -t 30 -i 1 -p 5202
  • -u:使用 UDP 协议
  • -b 20M:以 20Mbps 的速率发送

UDP 测试会告诉你丢包率。如果丢包率超过 1%,那推流大概率会卡。

注意: UDP 测试的 -b 参数要设置得比你的预期码率高一些。比如你打算推 10M 的流,那就用 -b 15M 来测,看看网络能不能扛住。

2.4 带宽测试的实战建议

光会跑命令还不够,你得知道怎么解读结果。我总结了几条经验:

测试结果 可能的问题 建议操作
带宽稳定,但数值偏低 运营商限速,或者路由器 QoS 限制 联系运营商,或者检查路由器设置
带宽波动大,忽高忽低 网络中有其他设备在抢带宽,或者 Wi-Fi 信号不稳定 关闭其他设备的上行流量,或者换有线
重传率(Retr)高 网络丢包严重,可能是线路质量差 检查网线、交换机,或者换一条链路
UDP 丢包率 > 1% 网络拥塞,或者中间设备有 UDP 限速 降低码率,或者改用 TCP 协议

嗯,这里还要多说一句:测带宽的时候,最好在推流的时间段测。比如你打算晚上 8 点直播,那就晚上 8 点跑一次 iperf。不同时间段的网络状况可能差很多。

一个小技巧: 我习惯在推流机器上写一个脚本,每隔 5 分钟自动跑一次 iperf,把结果记到日志里。这样,如果推流出问题了,我可以回头查日志,看看当时带宽是不是有波动。

2.5 知识体系:带宽排查的核心逻辑

说了这么多,其实带宽排查就三步:测、看、调。下面这张图帮你理清思路:

带宽排查核心逻辑 带宽排查核心逻辑 第一步:测 第二步:看 第三步:调 用 iperf 测上行带宽 测 TCP 和 UDP 两种模式 在推流时间段测 看带宽数值是否稳定 看重传率(Retr) 看 UDP 丢包率 根据结果调整码率 优化网络链路 启用 QoS 或限速 核心原则:先测后调,数据说话,不要凭感觉

说白了,带宽排查就是先拿到真实数据,然后根据数据做决策。不要凭感觉调码率,也不要盲目换服务器。用 iperf 跑一遍,什么都清楚了。

我个人习惯,每次搭建新的推流环境,第一件事就是在推流机和服务器之间跑一次 iperf,把结果记下来。这样,以后出问题了,我至少知道“之前是好的,现在变差了”,排查范围一下子就缩小了。