한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

游戏卡顿白皮书 › 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%,看“网卡中断集中在单个核心”
确认手段
运维工具即可确认(无需游戏代码)

出处

  1. Linux Base Driver for Intel(R) Ethernet Network Connection (e1000) Linux kernel
    e1000 接收描述符(环形缓冲区槽位)默认 256 个,最多可调到 4,096 个
  2. drivers/net/ethernet/intel/ice/ice.h (Linux v6.12) Linux kernel
    ice 驱动接收描述符默认 2,048 个,最多 8,160 个
  3. Interface statistics Linux kernel
    因缓冲区不足被设备丢弃的包计入 rx_missed_errors,各驱动的统计用 ethtool -S 查看
  4. ethtool(8) — Linux manual page ethtool
    -g 查看环形缓冲区大小(当前值、最大值),-G 修改,-S 查看驱动统计

相关原因

同一层:L6 服务器网卡

其他层中同样导致“瞬移”的原因

查看含图示和实验的原卡片