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

游戏卡顿白皮书 › 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 是空的却瞬移,就不是服务器发送侧的问题。看这个人的线路丢包(“无线链路丢包”)或画面插值
确认手段
需要游戏服务器/客户端的日志和指标

出处

  1. IP Sysctl Linux kernel
    tcp_wmem:自动调节的发送缓冲区最大值默认为 64 KB~4 MB(视内存而定);用 tcp_notsent_lowat、TCP_NOTSENT_LOWAT 限制尚未发送的数据量
  2. net/ipv4/tcp_diag.c (Linux v6.12) Linux kernel
    ss 的 Recv-Q、Send-Q 值:监听 socket 上是等待 accept 的连接数和 backlog 上限,已连接 socket 上是应用尚未读取的字节数和已发送但尚未收到 ACK 的字节数

相关原因

同一层:L8 Socket 与协议

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

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