游戏卡顿白皮书 › L9 服务器游戏进程
死循环/逻辑失控 Infinite loop / runaway logic
原因 ID sp-infinite-loop · 主责 研发团队·服务器开发
在含图示和实验的完整版中打开此卡片 →
bug 导致一个 tick 无法结束时,服务器会停住,然后被看门狗强制重启。
起因 条件写错导致循环不结束,或递归失控 → 结果 tick 结束不了,服务器停住 → 画面表现 卡住后所有人掉线
- 症状
- 卡住, 掉线
- 因素
- 停顿
- 谁会遇到
- 特定地点/分线, 全服
- 何时出现
- 做特定操作时, 偶尔随机
- 负责方
- 主责 研发团队·服务器开发
- 研发团队要做的事
- 循环次数上限;看门狗;问题输入的复现测试。
- 监控图上
- 连接成批断开 · 连接数、各线程 CPU
- 查看位置
- 停住期间用 pidstat -t 1 看各线程的 CPU,用 perf top -t(线程 ID)或 gdb 确认以 100% 运行的线程在哪个函数里打转。已经重启的话,看看门狗超时记录(systemd 的 WatchdogSec、Kubernetes 存活探针失败)
- 确认依据
- 服务器停住期间,一个游戏线程一直以 100% CPU 运行,调用栈始终在同一个函数、循环里打转
- 排除依据
- 停住期间 CPU 接近 0,看死锁或等待外部响应
- 确认手段
- 运维工具即可确认(无需游戏代码)
出处
- systemd.service(5) — Linux manual page systemd
WatchdogSec=:服务在规定时间内没发出存活信号(WATCHDOG=1)就视为失败并终止,根据 Restart= 设置自动重启 - Liveness, Readiness, and Startup Probes Kubernetes
用存活探针捕捉运行中却无法推进的状态并重启;默认每 10 秒检查一次,连续失败 3 次就重启 - pidstat(1) — Linux manual page sysstat
-t 同时显示进程下各线程的统计(CPU 使用率等) - perf-top(1) — Linux manual page perf
按函数(符号)实时显示运行中线程(-t)或进程(-p)的 CPU 使用占比
相关原因
同一层:L9 服务器游戏进程
其他层中同样导致“卡住”的原因
查看含图示和实验的原卡片