游戏卡顿白皮书 › L10 内存
缓存未命中 CPU cache misses
原因 ID mem-cache-miss · 主责 研发团队·服务器开发
在含图示和实验的完整版中打开此卡片 →
数据分散在内存各处时,CPU 每次都要到较慢的内存里取数据并等待。
起因 对象通过指针分散在各处,访问顺序杂乱 → 结果 CPU 缓存里没有,每次都从内存读取(慢 100 倍左右) → 画面表现 做同样的事,tick 开销翻几倍,严重时出现慢动作
- 症状
- 慢动作
- 因素
- 停顿
- 谁会遇到
- 全服
- 何时出现
- 一直, 人多的时候
- 负责方
- 主责 研发团队·服务器开发
- 研发团队要做的事
- 把经常一起用的数据连续存放(面向数据设计)。
- 监控图上
- 一直偏高 · tick 耗时、CPU 使用率
- 查看位置
- 对游戏服务器进程执行 perf stat -d -p PID,测量每周期指令数(insn per cycle)和 L1、LLC 缓存未命中,与 tick 耗时、CPU 使用率一起看
- 确认依据
- CPU 一直很忙,但 insn per cycle 低、LLC 未命中多。改了数据布局的版本在同样人数下 tick 耗时大幅下降,即可确定
- 排除依据
- CPU 使用率低而 tick 慢,是锁、I/O 等待这类在 CPU 之外等待的原因
- 确认手段
- 运维工具即可确认(无需游戏代码)
出处
- Designs, Lessons and Advice from Building Large Distributed Systems (LADIS 2009 keynote) Google
L1 缓存 0.5 ns,L2 缓存 7 ns,主存 100 ns(2009 年数据):访问内存比访问缓存慢一两个数量级 - perf-stat(1) — Linux manual page perf
-p 统计运行中进程的硬件事件并显示 insn per cycle,-d 增加 L1、LLC 数据缓存事件
相关原因
同一层:L10 内存
其他层中同样导致“慢动作”的原因
查看含图示和实验的原卡片