游戏卡顿白皮书 › TCP 重传的根本原因
接收端服务器主机丢包 Receiver host drops (ring, softirq, CPU)
原因 ID rt-host-drop · 主责 运维团队·系统运维
在含图示和实验的完整版中打开此卡片 →
数据包已经到了服务器,却因网卡的环形缓冲区(暂存到达数据包的缓冲区)溢出,或内核中负责接收处理的 CPU 核心饱和而被丢弃。
起因 在线人数激增、中断集中在一个核心、虚拟机 CPU 窃取时间、虚拟交换机过载 → 结果 在环形缓冲区(rx_missed_errors 等,名称因驱动而异)或内核接收队列(softnet dropped)处被丢弃 → 画面表现 人一多,全服同时出现输入生效慢、顿一下的情况
- 症状
- 操作延迟, 卡住, 快进, 瞬移
- 因素
- 丢包, 停顿
- 谁会遇到
- 全服
- 何时出现
- 人多的时候
- 负责方
- 主责 运维团队·系统运维
- 运维团队要做的事
- 把 ethtool -S 的 rx_missed_errors 这类丢弃计数器和 /proc/net/softnet_stat 的 dropped 加入监控;调大环形缓冲区(ethtool -G);用 RSS 把中断分散到多个核心;把游戏线程与接收处理核心分开;保证 CPU 余量;虚拟机要检查 CPU 窃取时间和虚拟交换机负载。
- 数值参考
- 服务器在接收时丢掉的包由客户端重发。所以服务器的重传指标上不太看得出来,会先体现在 ethtool -S 的 rx_missed_errors 这类丢弃计数器(名称因驱动而异)和 /proc/net/softnet_stat 的 dropped 上。
- 监控图上
- 触顶后走平 · 各核心 softirq 占用率,网卡丢弃计数器
- 查看位置
- 看 ethtool -S 的丢弃计数器(rx_missed_errors 等,mlx5 为 rx_out_of_buffer、rx_discards_phy)、ip -s -s link 的 missed、/proc/net/softnet_stat 的第 2 列(dropped)和第 3 列(time_squeeze),并用 mpstat -P ALL 看各核心的 %soft(软中断处理)。虚拟机还要看 %steal
- 确认依据
- 人多的时刻丢弃计数器或 softnet dropped 增加,负责接收处理的核心 %soft 接近 100% 后再也上不去。该服务器所有连接的输入同时变慢
- 排除依据
- 服务器的丢弃计数器不变,重传集中在特定地区或运营商的连接上,就是路径上的丢包。服务器发出的包在路径上丢失时,服务器 nstat 的 TcpRetransSegs 会增加,这些计数器则不变
- 确认手段
- 运维工具即可确认(无需游戏代码)
出处
- Interface statistics Linux kernel
rx_missed_errors 是主机因没有缓冲区而没能接收的数据包数(/proc/net/dev 中计入 drop),可用 ip -s -s link 查看 - drivers/net/ethernet/intel/igb/igb_ethtool.c Linux kernel
ethtool -S 的计数器名称由驱动决定(例如 igb 的 rx_missed_errors、rx_no_buffer_count) - Ethtool counters Linux kernel
mlx5 驱动的 rx_out_of_buffer(接收队列没有缓冲区)、rx_discards_phy(端口缓冲区不足而丢弃) - net/core/net-procfs.c Linux kernel
/proc/net/softnet_stat 每个 CPU 一行,十六进制,第 2 列是 dropped,第 3 列是 time_squeeze - Documentation for /proc/sys/net/ Linux kernel
netdev_max_backlog:数据包到达速度快于内核处理速度时,用来暂存的接收队列上限 - Scaling in the Linux Networking Stack Linux kernel
RSS:网卡把数据包分到多个接收队列,由多个 CPU 处理 - ethtool(8) — Linux manual page ethtool
用 -G(--set-ring)修改环形缓冲区大小 - proc_stat(5) — Linux manual page Linux man-pages
/proc/stat 的 steal:虚拟化环境中其他操作系统占用 CPU 的时间 - mpstat(1) — Linux manual page sysstat
mpstat -P ALL 显示各核心利用率;%soft 是软中断处理时间,%steal 是因 hypervisor 在处理其他虚拟 CPU 而等待的时间 - net/ipv4/proc.c Linux kernel
nstat 中的 TcpRetransSegs(Tcp 项下的 RetransSegs)
相关原因
同一层:TCP 重传的根本原因
其他层中同样导致“操作延迟”的原因
查看含图示和实验的原卡片