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

游戏卡顿白皮书 › 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 之外等待的原因
确认手段
运维工具即可确认(无需游戏代码)

出处

  1. Designs, Lessons and Advice from Building Large Distributed Systems (LADIS 2009 keynote) Google
    L1 缓存 0.5 ns,L2 缓存 7 ns,主存 100 ns(2009 年数据):访问内存比访问缓存慢一两个数量级
  2. perf-stat(1) — Linux manual page perf
    -p 统计运行中进程的硬件事件并显示 insn per cycle,-d 增加 L1、LLC 数据缓存事件

相关原因

同一层:L10 内存

其他层中同样导致“慢动作”的原因

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