2、网络带宽排查:带宽测试方法、上行带宽不足的表现、如何通过工具(如 iperf)测量真实带宽
推流卡顿,十有八九跟网络带宽有关。但很多人一上来就怀疑服务器,或者怪编码器,其实最该先查的,是上行带宽。
我个人习惯,遇到推流卡顿,第一件事不是调码率,而是先跑一遍带宽测试。为什么?因为很多所谓的“卡顿”,其实是上行带宽被占满了,数据发不出去。
2.1 上行带宽不足的典型表现
上行带宽不够,推流端会有一些非常明显的特征。我列几个最常见的,你看看是不是遇到过:
- 推流端 CPU 占用不高,但编码器频频报错 —— 编码器本身没问题,是数据发不出去,缓冲区满了。
- 播放端画面突然卡住,然后快进 —— 这叫“跳帧”,因为推流端丢了一部分数据,播放器只能跳过。
- 推流软件显示“发送缓冲区满”或“网络抖动” —— 这是最直接的信号。
- 上行带宽跑满,但下行带宽还有大量余量 —— 很多人只看总带宽,其实上行和下行是两条路。
嗯,这里要注意:上行带宽不足,有时候不是一直不足,而是间歇性的。比如你家里有人在看 4K 视频,或者下载大文件,上行就会被挤占。我在项目中遇到过好几次,客户说“晚上 8 点准时卡”,一查,原来是家里人都在刷抖音,上行被占满了。
2.2 带宽测试方法:别信运营商给的数字
运营商说的“100M 宽带”,通常指的是下行。上行?很多家庭宽带的上行只有 10M 甚至更低。你想想看,推流需要的是上行,下行再快也没用。
所以,测带宽要分两步走:
- 测下行 —— 用 Speedtest 之类的工具,看看你家的下行到底有多少。
- 测上行 —— 这才是关键。很多测速工具默认只测下行,你得手动切到上行测试。
但说实话,Speedtest 这类工具测出来的结果,只能当参考。为什么?因为它的服务器通常离你很近,网络路径短,测出来的数字往往偏大。真实推流场景,你的数据要经过很多跳才能到 CDN 节点,中间可能有各种瓶颈。
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 这一列,如果重传次数很多,说明网络质量不好,有丢包。
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%,那推流大概率会卡。
-b 参数要设置得比你的预期码率高一些。比如你打算推 10M 的流,那就用 -b 15M 来测,看看网络能不能扛住。
2.4 带宽测试的实战建议
光会跑命令还不够,你得知道怎么解读结果。我总结了几条经验:
| 测试结果 | 可能的问题 | 建议操作 |
|---|---|---|
| 带宽稳定,但数值偏低 | 运营商限速,或者路由器 QoS 限制 | 联系运营商,或者检查路由器设置 |
| 带宽波动大,忽高忽低 | 网络中有其他设备在抢带宽,或者 Wi-Fi 信号不稳定 | 关闭其他设备的上行流量,或者换有线 |
| 重传率(Retr)高 | 网络丢包严重,可能是线路质量差 | 检查网线、交换机,或者换一条链路 |
| UDP 丢包率 > 1% | 网络拥塞,或者中间设备有 UDP 限速 | 降低码率,或者改用 TCP 协议 |
嗯,这里还要多说一句:测带宽的时候,最好在推流的时间段测。比如你打算晚上 8 点直播,那就晚上 8 点跑一次 iperf。不同时间段的网络状况可能差很多。
2.5 知识体系:带宽排查的核心逻辑
说了这么多,其实带宽排查就三步:测、看、调。下面这张图帮你理清思路:
说白了,带宽排查就是先拿到真实数据,然后根据数据做决策。不要凭感觉调码率,也不要盲目换服务器。用 iperf 跑一遍,什么都清楚了。
我个人习惯,每次搭建新的推流环境,第一件事就是在推流机和服务器之间跑一次 iperf,把结果记下来。这样,以后出问题了,我至少知道“之前是好的,现在变差了”,排查范围一下子就缩小了。