游戏卡顿白皮书 › L8 Socket 与协议
慢客户端(slow consumer)处理策略 Slow-consumer policy
原因 ID sk-slow-client · 主责 研发团队·服务器开发
在含图示和实验的完整版中打开此卡片 →
对待发送数据不断堆积的客户端,服务器会丢弃过时的更新或断开连接。
起因 客户端线路跟不上服务器发送的量 → 结果 服务器丢弃过时的更新,超过上限时断开连接 → 画面表现 只有这个人瞬移或掉线
- 症状
- 瞬移, 掉线
- 因素
- 丢包
- 谁会遇到
- 只有我
- 何时出现
- 人多的时候
- 负责方
- 主责 研发团队·服务器开发
- 研发团队要做的事
- 减少发送量(按距离设定更新频率);降低质量继续发送;减少堆在内核里的数据量(Linux TCP_NOTSENT_LOWAT)。
- 数值参考
- 发送缓冲区为 256 KB 时,在 30 KB/s 的线路上会积压 8 秒以上的数据。Linux 还可能把这个缓冲区自动扩大到几 MB。
- 监控图上
- 仅部分偏高 · 每个连接的 Send-Q、每个客户端丢弃的更新数
- 查看位置
- 查看游戏服务器记录的每个客户端的发送队列长度、丢弃的更新数、断开原因,并在服务器上用 ss -tni 一起确认该连接的 Send-Q 和 cwnd
- 确认依据
- 只有瞬移或掉线的人的连接 Send-Q 一直是满的,游戏日志里记录了这个人的更新被丢弃,或因发送队列超限而断开
- 排除依据
- Send-Q 是空的却瞬移,就不是服务器发送侧的问题。看这个人的线路丢包(“无线链路丢包”)或画面插值
- 确认手段
- 需要游戏服务器/客户端的日志和指标
出处
- IP Sysctl Linux kernel
tcp_wmem:自动调节的发送缓冲区最大值默认为 64 KB~4 MB(视内存而定);用 tcp_notsent_lowat、TCP_NOTSENT_LOWAT 限制尚未发送的数据量 - net/ipv4/tcp_diag.c (Linux v6.12) Linux kernel
ss 的 Recv-Q、Send-Q 值:监听 socket 上是等待 accept 的连接数和 backlog 上限,已连接 socket 上是应用尚未读取的字节数和已发送但尚未收到 ACK 的字节数
相关原因
同一层:L8 Socket 与协议
其他层中同样导致“瞬移”的原因
查看含图示和实验的原卡片