游戏卡顿白皮书 › L9 服务器游戏进程
单线程区域过载(热点) Single-threaded hot zone
原因 ID sp-hotzone · 主责 研发团队·服务器开发 · 配合 运维团队·系统运维
在含图示和实验的完整版中打开此卡片 →
每个区域由一个线程负责的架构下,人一旦聚到一处,只有那一个核心会跑到 100%。
起因 一个线程负责一个区域(分线) → 结果 人聚到一处时只有那个核心饱和,其余核心还有余量 → 画面表现 只有那个区域卡顿,其他区域正常
- 症状
- 慢动作, 操作延迟
- 因素
- 停顿
- 谁会遇到
- 特定地点/分线
- 何时出现
- 人多的时候
- 负责方
- 主责 研发团队·服务器开发 · 配合 运维团队·系统运维
- 研发团队要做的事
- 分散到多条分线;区域内部并行化;人数上限。
- 运维团队要做的事
- 把各核心 CPU 使用率加入监控和告警(整台服务器的平均值会把单个核心的饱和掩盖掉)。
- 数值参考
- 16 核服务器上即使有一个核心 100%,整台服务器的 CPU 使用率看起来也只有约 6%。要看各核心的使用率才能发现。
- 监控图上
- 随人数/负载上升 · 各核心 CPU 使用率、各线程 CPU
- 查看位置
- 用 mpstat -P ALL 1 看各核心使用率,用 pidstat -t 1 看游戏进程各线程的 CPU,与最忙线程所负责场景的人数对比
- 确认依据
- 整台服务器 CPU 不高,只有一个线程(一个核心)贴近 100%,且那时这个线程负责的场景里人很多
- 排除依据
- 多个核心都均匀偏高,是整台服务器过载。只有一个核心的 %soft(接收处理)高,看“网卡中断集中在单个核心”
- 确认手段
- 运维工具即可确认(无需游戏代码)
- 深入了解
- “其他区域正常”只适用于每个区域单独跑 tick 的情况。如果多个区域线程每个 tick 都要互相等待、再一起进入下一个 tick,最忙的那个区域就会拖慢整台服务器的 tick。
- 真实案例
- CCP Games 2014: EVE Online HED-GP 大规模舰队战中的服务器过载
出处
- Time Dilation – How’s That Going? CCP Games
EVE Online 的 Time Dilation 以节点为单位,同一节点上远处的星系也会一起变慢;大战在只放 4 个星系的强化节点上处理 - mpstat(1) — Linux manual page sysstat
分别显示每个处理器的使用率和整体平均值(-P ALL),%soft 是处理软中断所用的时间比例 - pidstat(1) — Linux manual page sysstat
-t 同时显示进程下各线程的统计(CPU 使用率等)
相关原因
同一层:L9 服务器游戏进程
其他层中同样导致“慢动作”的原因
查看含图示和实验的原卡片