游戏卡顿白皮书 › L6 服务器网卡
环形缓冲区不足 RX ring buffer overflow
原因 ID nic-ring · 主责 运维团队·系统运维
在含图示和实验的完整版中打开此卡片 →
网卡用来暂存数据包的环形缓冲区太小时,流量瞬间涌入就会溢出,数据包被丢弃。
起因 环形缓冲区保持默认值,容量偏小(因驱动而异,256~2,048 个槽位) → 结果 突发时 CPU 还没来得及取走,缓冲区就溢出了 → 画面表现 只在突发的瞬间丢包(瞬移、吞技能)。游戏服务器日志里没有任何痕迹
- 症状
- 瞬移, 吞操作/回档
- 因素
- 丢包
- 谁会遇到
- 全服
- 何时出现
- 人多的时候
- 负责方
- 主责 运维团队·系统运维
- 运维团队要做的事
- 调大环形缓冲区(ethtool -G);监控丢弃(drop)计数器(ethtool -S 的 rx_missed_errors 等,名称因驱动而异)。
- 数值参考
- 每秒涌入 100 万个包时,1,024 个槽位约 1 ms 就会被占满。这期间 CPU 只要晚来一次就会溢出。大多数网卡可以调到几千个。
- 监控图上
- 偶发随机尖峰 · 网卡接收丢弃计数器
- 查看位置
- 以较短间隔采集 ethtool -S 的接收丢弃计数器(rx_missed_errors、rx_fifo_errors 等,名称因驱动而异)和 ip -s -s link 的 missed,用 ethtool -g 查看当前环形缓冲区大小和最大值
- 确认依据
- 突发瞬间丢弃计数器增加,当前环形缓冲区远小于最大值。调大后丢弃减少
- 排除依据
- 丢弃计数器不变却有丢包,看内核的下一环节(“内核 socket 缓冲区不足”)或网络链路。单个核心的 %soft 达到 100%,看“网卡中断集中在单个核心”
- 确认手段
- 运维工具即可确认(无需游戏代码)
出处
- Linux Base Driver for Intel(R) Ethernet Network Connection (e1000) Linux kernel
e1000 接收描述符(环形缓冲区槽位)默认 256 个,最多可调到 4,096 个 - drivers/net/ethernet/intel/ice/ice.h (Linux v6.12) Linux kernel
ice 驱动接收描述符默认 2,048 个,最多 8,160 个 - Interface statistics Linux kernel
因缓冲区不足被设备丢弃的包计入 rx_missed_errors,各驱动的统计用 ethtool -S 查看 - ethtool(8) — Linux manual page ethtool
-g 查看环形缓冲区大小(当前值、最大值),-G 修改,-S 查看驱动统计
相关原因
同一层:L6 服务器网卡
其他层中同样导致“瞬移”的原因
查看含图示和实验的原卡片