3. 推流链路全景

推流卡顿,很多时候不是网络背锅,而是你本地的硬件先扛不住了。我见过太多团队,花大把时间调编码参数、换CDN,最后发现是CPU一直在100%跑,或者内存被其他进程吃光了。

这一章,咱们就聚焦在硬件层面。说白了,就是看看你的电脑有没有“带得动”当前的推流任务。

3.1 CPU占用率检查:别让编码器“饿死”

CPU是推流的大脑。x264编码器尤其吃CPU,如果你用的是软件编码,CPU一旦满载,编码线程就会被调度延迟,直接导致帧生成不及时,推流端就开始掉帧、卡顿。

3.1.1 怎么看CPU是否过载?

我个人习惯,在推流的同时,打开任务管理器(Windows)或htop(Linux),盯住这几个指标:

  • 整体CPU使用率:如果持续超过90%,基本可以判定是瓶颈。
  • 推流进程的CPU占用:OBS或ffmpeg进程吃了多少?如果单进程就占了80%以上,说明编码预设太高了。
  • CPU频率是否降频:笔记本用户尤其要注意。温度一高,CPU自动降频,性能断崖式下跌。
我的经验: 有一次排查一个游戏主播的卡顿问题,他用的i9-13900K,按理说性能绰绰有余。结果一看,CPU温度飙到100度,频率从5.5GHz掉到了2.1GHz。嗯,散热器上的膜没撕。撕掉之后,一切正常。

3.1.2 避坑指南:别被“总占用率”骗了

你可能会看到CPU总占用只有60%,但推流还是卡。为什么?因为编码是并行任务,如果某个核心被其他进程占满了,编码线程就只能排队。我建议你观察每个核心的负载,而不是只看总和。

注意: 如果某个核心长期100%,而其他核心空闲,这叫“负载不均”。这时候调高编码的线程数(threads参数)可能反而有用,但别超过物理核心数。

3.2 内存使用情况:别让系统开始“交换”

内存不够,系统就会用硬盘当内存——也就是交换(swap)。一旦开始swap,推流进程的响应时间会从毫秒级变成秒级,卡顿是必然的。

3.2.1 关键指标

指标 正常范围 危险信号
物理内存使用率 < 80% > 90% 且持续上升
Swap使用量 0 MB > 0 MB 且持续增长
推流进程内存占用 稳定,不持续增长 持续增长(内存泄漏)

我曾经遇到一个案例:推流跑了2小时后开始卡顿,重启后又好了。查了半天,发现是OBS的一个插件有内存泄漏,每帧泄漏几十KB,2小时后吃掉了8GB内存,系统被迫开始swap。换掉插件后,问题解决。

快速检查命令(Linux):
# 查看内存和swap使用情况
free -h

# 查看推流进程的内存占用(假设PID是1234)
cat /proc/1234/status | grep VmRSS

3.3 GPU编码负载分析:硬件编码的“隐形坑”

现在很多推流都用GPU硬件编码(NVENC、AMF、QSV),确实省CPU。但GPU编码也有自己的脾气,不是开了硬件编码就万事大吉。

3.3.1 GPU编码的核心指标

你需要在GPU监控工具里看这几个东西:

  • Video Encode 引擎占用率:NVENC专用单元的使用率。如果接近100%,说明编码器满载了,再提高码率或分辨率就会丢帧。
  • GPU 核心频率与温度:和CPU一样,温度过高会降频,导致编码性能下降。
  • 显存占用:虽然编码不占太多显存,但如果游戏或渲染程序已经把显存吃满了,编码器可能会因为显存带宽争抢而变慢。

3.3.2 一个常见的误解

很多人觉得“我用NVENC编码,CPU占用很低,所以没问题”。其实不一定。NVENC虽然不占CPU,但它会占用PCIe带宽和显存控制器。如果你同时在玩游戏,游戏也在疯狂读写显存,两者就会打架。我见过一个案例,用RTX 4090推4K HDR,游戏帧率正常,但推流画面每隔几秒就卡一下。后来发现是显存带宽被游戏占满了,NVENC拿不到足够的带宽去处理编码帧。

我的建议: 推流时,打开GPU-Z或NVIDIA SMI,观察“Memory Controller Load”和“Video Engine Load”。如果两者都高,试着降低游戏画质或限制游戏帧率,给编码器留出带宽。

3.4 硬件排查流程图:从现象到根因

下面这张图,是我自己排查硬件问题时常用的思路。你可以照着这个顺序走一遍,基本能定位到问题出在哪个环节。

推流端硬件排查流程图 推流出现卡顿 步骤1:检查CPU占用率 CPU > 90% 或单核满载? 是 降低编码预设 或换硬件编码 否 进入步骤2 检查内存 步骤2:检查内存使用情况 内存 > 90% 或 Swap > 0? 是 关闭无关进程 或增加物理内存 否 进入步骤3 检查GPU编码 步骤3:检查GPU编码负载

3.5 总结一下排查要点

硬件排查,说白了就是三板斧:

  1. 看CPU:是不是满载了?是不是降频了?编码线程有没有被饿死?
  2. 看内存:物理内存够不够?有没有发生swap?推流进程有没有内存泄漏?
  3. 看GPU:编码引擎占用率多少?显存带宽有没有被其他程序抢走?

这三步走完,90%的硬件相关卡顿都能找到原因。剩下的10%,可能是驱动问题、固件bug或者硬件本身有缺陷——那些就是更深入的排查了。

最后提醒一句: 别一上来就怀疑硬件。先看看推流软件设置、编码参数、网络状况。硬件排查是最后一道防线,但也是最容易忽略的一环。我见过太多人,换了CPU、加了内存,结果发现是OBS里选了“超快”预设导致画质太差——嗯,方向错了。