服务器网络抖动是什么原因?丢包、拥塞与链路质量排查

监控图上平均延迟一直稳定在 160ms,可用户却在投诉"时快时慢";SSH 敲命令偶尔要等半秒才回显;视频会议每隔几分钟卡一下。这类现象的元凶通常不是"延迟高",而是抖动(Jitter)——延迟的稳定性差。抖动对交互式业务和实时业务的杀伤力,往往远大于单纯的延迟绝对值。但它也是最容易被忽略的指标:大部分监控只画平均值,把波动给平滑掉了。本文讲清楚抖动的成因、如何量化它、如何定位到具体网段,以及不同成因对应的处置手段。

一、什么是抖动,为什么它比平均延迟更致命

1.1 定义

抖动指延迟的变化程度,通常用延迟样本的标准差(ping 输出里的 mdev)或相邻包延迟差的平均值来衡量。举例:一组样本的延迟依次是 155、158、160、157、330、156 ms,平均值会被那个 330 拉高一些,但真正的问题是那个突发的 330——它代表某次排队或重传。

1.2 不同业务对抖动的敏感度

业务类型主要敏感指标抖动的典型影响
网页浏览、文件下载吞吐、丢包影响较小,TCP 可重传补偿
SSH / 远程桌面延迟、抖动输入回显一顿一顿,操作手感差
API 调用、微服务尾延迟(P99)单次慢请求拖慢整体链路
语音 / 视频会议抖动、丢包卡顿、断续、音画不同步
实时游戏抖动、丢包瞬移、操作延迟不可预测
数据库同步 / 分布式一致性延迟、丢包超时重试、主从延迟增大

关键结论:凡是"一次请求要等结果"的交互式场景,抖动都会被直接感知;凡是"大块数据慢慢传"的场景,抖动影响相对可控。所以排查抖动前,先确认投诉来自哪类业务,这决定了处置的优先级。

二、抖动的四类常见成因

2.1 链路拥塞(最常见)

当某段链路的流量超过其容量时,数据包在路由器队列中排队等待,队列越长延迟越高,而队列长度随流量波动,就产生了抖动。拥塞有几种典型形态:

  • 国际出口拥塞:跨境流量在晚间高峰(国内时间约 20:00-23:00)集中,出口队列排满,延迟与抖动同步上升
  • 跨网互联点拥塞:用户是移动/联通、机房主接电信时,数据要经过运营商互联点,该点容量不足就会拥塞
  • 机房上行打满:机房出口带宽跑满,所有流量一起排队
  • 本地宽带上行打满:用户侧有上传、云盘同步、视频会议占用上行,ACK 回不去导致延迟飙升

2.2 丢包与重传

丢包本身会造成延迟突刺:TCP 检测到丢包后要等待重传超时(RTO)或快速重传,这段时间可能是正常 RTT 的数倍。丢包原因包括:

  • 拥塞导致的队列尾丢(tail drop)
  • 链路质量问题(光衰、误码、接触不良)
  • 设备性能不足(CPU 高导致转发丢包)
  • 安全策略或限速(ICMP 限速、连接数限制)
  • MTU 不匹配导致分片丢弃

2.3 路由不稳定

  • 路由震荡:BGP 会话不稳定、链路频繁切换,导致路径反复变化,延迟随路径切换而跳变
  • 负载分担:等价多路径(ECMP)下不同包走不同路径,若各路径延迟差异大,就会产生抖动
  • 绕路:本可直达却绕道,延迟基数被抬高

2.4 服务器自身

  • CPU 满载或软中断集中在单核,导致包处理不及时
  • 网卡协商异常(速率/双工不匹配)产生错包
  • 连接队列、accept 队列满
  • 内核缓冲区或拥塞控制参数配置不当
  • 虚拟化环境的 CPU 抢占(steal time)

三、量化抖动:先把现象测准

3.1 用 ping 测抖动基线

# 100 个包、间隔 0.2 秒,约 20 秒完成
ping -c 100 -i 0.2 203.0.113.10

# 关注最后一行
# rtt min/avg/max/mdev = 152.301/168.772/341.220/38.455 ms

判断参考(经验值,需结合业务容忍度):

  • mdev 低于 avg 的 10%:链路稳定
  • mdev 在 avg 的 10%-25%:存在可感知波动,需要关注
  • mdev 超过 avg 的 25%:明显抖动,交互式业务会受影响
  • max 超过 avg 的 2 倍以上:存在突发性排队或重传

3.2 更精细:用 ping 的时间戳看逐包变化

# 开启时间戳,观察每个包的延迟变化规律
ping -D -c 100 -i 0.2 203.0.113.10

# 只打印往返时间,便于后续统计
ping -c 200 -i 0.1 203.0.113.10 | awk -F'time=' '/time=/{print $2}'

把逐包延迟导出后,可以观察抖动是随机分布(拥塞)还是周期性(定时任务、备份流量、流量整形)。周期性抖动往往指向内部流量调度或限速策略。

3.3 用 MTR 看抖动的分布位置

# TCP 模式,100 个周期,报告模式
mtr -T -P 80 --report --report-cycles 100 203.0.113.10

# 关注 StDev 列,找到标准差从哪一跳开始变大
mtr -T -P 443 --report --report-cycles 200 203.0.113.10

MTR 输出中 StDev 列就是该跳的抖动。定位规则:找到 StDev 首次明显增大的那一跳,问题就出在它之后的那段链路上。如果从第一跳就大,问题在本地;如果只有最后一跳大,问题在服务器;如果中间某跳之后整体抬升,问题在运营商链路。

3.4 用 ss 看真实连接的 RTT 与重传

# 显示每条连接的 RTT、重传数、拥塞窗口、发送/接收队列
ss -i

# 只看已建立连接并统计状态分布
ss -ant | awk 'NR>1{print $1}' | sort | uniq -c

# 查看 TCP 全局统计中的重传相关计数
cat /proc/net/snmp | grep -i Tcp

ss -i 输出中的 rtt(如 rtt:168.5/22.3,分别是平滑 RTT 与其偏差)和 retrans(重传数)是关键指标。若 rtt 的偏差值大且 retrans 持续增长,说明链路上存在真实丢包导致的抖动;若 rtt 正常但 retrans 高,可能是乱序或缓冲区问题。

四、定位方法:五个对比维度

抖动排查的核心方法是做对比,通过控制变量缩小范围。

4.1 逐跳对比:定位到具体网段

如上所述,用 mtr -T -P 80 --report --report-cycles 100 找到 StDev 开始变大的跳。把该跳 IP 的归属查清楚:

# 查询 IP 归属的 AS 与网段信息
whois 203.0.113.1 | grep -i -E 'origin|netname|descr|country'

这样能确认问题发生在"本地接入网""用户运营商骨干""国际出口""机房上游"还是"机房内部",便于后续找正确的责任方。

4.2 跨网段对比:确认是否普遍现象

换三个不同网络环境测同一目标:办公网(企业专线)、家庭宽带、手机流量。同时换运营商环境(电信/联通/移动)。

  • 只有某个网络抖:问题在该网络或其到机房的路径上
  • 所有网络都抖:问题在机房侧或公共链路上
  • 只有某个运营商抖:典型的跨网互联或该运营商方向接入质量问题

4.3 晚高峰对比:确认是否拥塞

在三个时段用完全相同的命令测:上午 10 点、晚上 21 点、凌晨 2 点。把 avg、mdev、丢包率列表对比。

时段对比结果可能成因处置方向
仅晚高峰劣化,凌晨恢复国际出口或互联点拥塞更换优化线路、错峰、CDN 分流
全天都抖,无时段规律链路质量、设备问题、路由震荡提交工单排查链路、检查网卡
特定时间周期性出现内部备份/同步任务、流量整形调整任务时间、做 QoS
仅业务高峰时抖带宽打满扩容带宽或限速
全天稳定,偶发突刺瞬时拥塞或路径切换观察频率,一般不紧急

4.4 双向对比:去程与回程

抖动常常只出现在一个方向。从本地测去程,登录服务器测回程:

# 在服务器上反向测到国内目标
mtr -n --report --report-cycles 100 1.2.4.8
ping -c 100 -i 0.2 1.2.4.8

若回程抖动大而去程正常,说明响应数据在返回途中排队——这在跨境链路中非常常见,也是很多"去程很快却依然卡顿"的原因。

4.5 同机房对比:排除个案

找同机房的另一台机器(或让服务商提供测试 IP)做同样的测试。若同机房其他机器正常,问题在你的服务器;若都抖,是机房或上游链路的问题。

五、服务器自身排查与优化

5.1 网卡与链路层

# 查看网卡速率、双工、协商状态
ethtool eth0

# 查看网卡错包、丢帧、溢出统计
cat /proc/net/dev

# 查看更详细的网卡统计(部分网卡支持)
ethtool -S eth0 | grep -i -E 'err|drop|discard|over'

若 ethtool 显示速率未协商到预期(如千兆口协商成 100Mb)或 Duplex 为 Half,或 cat /proc/net/dev 中 errs/drop 持续增长,先解决链路层问题再谈优化。

5.2 软中断与 CPU

# 查看软中断分布,判断网络包处理是否集中在单核
cat /proc/softirqs | grep -i NET

# 实时监控 CPU 与中断
top -1

# 虚拟化环境查看 CPU 抢占
vmstat 1

若 NET_RX 软中断几乎全集中在某一个 CPU 且该 CPU 使用率高,可开启多队列(RSS)或 RPS/RFS 把负载分散到多核。

5.3 是否带宽打满

# 按网卡实时查看流量
sar -n DEV 1

# 按进程查看流量(需安装 nethogs)
nethogs eth0

带宽打满时的抖动特征是:抖动曲线与流量曲线高度吻合,高峰期抖、低谷期稳。处置方式是扩容或做流量限速与优先级调度。

5.4 协议栈与拥塞控制

# 查看当前拥塞控制算法
sysctl net.ipv4.tcp_congestion_control

# 查看可用算法
sysctl net.ipv4.tcp_available_congestion_control

# 查看 TCP 缓冲区设置
sysctl net.ipv4.tcp_rmem net.ipv4.tcp_wmem

对跨洋高延迟链路,BBR 通常在吞吐表现上优于默认的 CUBIC,尤其在存在轻微丢包时。但要注意:BBR 改善的是吞吐,不会降低延迟和抖动,不要指望它解决实时业务的卡顿。

六、抖动排查步骤清单

  1. 确认现象:明确是持续抖动、周期性抖动还是偶发突刺,记录发生时段与投诉业务类型
  2. 量化基线:ping -c 100 -i 0.2,记录 avg、mdev、max、丢包率
  3. 逐跳定位:mtr -T -P 80 --report --report-cycles 100,找 StDev 开始变大的跳,用 whois 确认归属
  4. 排除服务器:ethtool 查协商、cat /proc/net/dev 查错包、ss -i 查重传、sar -n DEV 1 查是否跑满、cat /proc/softirqs 查软中断集中
  5. 跨网段对比:换办公网/家庭网/手机流量、换运营商各测一次
  6. 晚高峰对比:10 点、21 点、凌晨 2 点三次采样,制表对比
  7. 双向对比:登录服务器反向 mtr,确认去程回程是否都存在抖动
  8. 同机房对比:找同机房其他机器或服务商测试 IP 对照
  9. 路径检查:traceroute -n -T -p 80 看是否绕路
  10. 归类处置:本地问题联系宽带商;机房内部问题自行处理或报修;上游链路问题提交工单并附 MTR 证据
  11. 验证闭环:处理后在同一时段同一网络重测,对比 mdev 与丢包率是否改善
  12. 建立基线:把每日固定时段数据存档,形成可对比的时间序列

七、不同成因的处置对照

成因可观测特征处置手段
国际出口拥塞仅晚高峰劣化,去程或回程单向明显换优化回国线路、CDN 分流、错峰传输
跨网互联瓶颈仅特定运营商用户受影响选择 BGP 多线机房、接入覆盖该运营商的线路
机房上行打满抖动与流量曲线吻合扩容带宽、限速、流量分级
网卡/链路层故障errs/drop 持续增长,协商异常更换网线光模块、检查交换机端口、联系机房
CPU 或软中断瓶颈单核软中断集中,负载高时抖开启 RSS/RPS、优化中断亲和、扩容 CPU
路由震荡路径在多次测试中不一致提交工单,要求上游排查 BGP 稳定性
内部任务抢占周期性出现,与备份/同步时间吻合调整任务时间、限速、错峰
虚拟化 CPU 抢占vmstat 中 st 值偏高更换宿主机、选择独享型实例

小结

网络抖动的本质是延迟的不稳定,对交互式与实时业务的伤害远大于平均延迟偏高。排查的关键是量化与对比:ping -c 100 -i 0.2 提供 mdev 与丢包基线,mtr --report --report-cycles 100 用 StDev 列定位抖动起始跳,ss -i 从真实连接角度看 RTT 偏差与重传,ethtool 与 cat /proc/net/dev 排除网卡与链路层问题。五个对比维度——逐跳对比、跨网段对比、晚高峰对比、双向对比、同机房对比——能覆盖绝大多数场景,把问题从"网络慢"精确到"某一段链路在某个时段的某个方向"。避坑要点:不要只看平均延迟,很多监控图把抖动平滑掉了;不要把中间跳的 ICMP 限速当成故障,看后续跳是否同样丢包;不要在白天测一次就下结论,晚高峰才是真实水平;不要指望 BBR 或任何拥塞控制算法降低抖动,它们优化的是吞吐;不要忽略回程方向,跨境链路中回程拥塞极为常见。最后,把测试数据按固定条件长期留存,当抖动再次出现时,历史基线会让你在几分钟内判断出"这是新故障还是老毛病"。


本文所述判断阈值为运维经验参考,不同业务对抖动的容忍度差异很大,请结合自身业务设定告警阈值。