游戏卡顿白皮书 › L10 内存
NUMA 远端内存 Remote NUMA access
原因 ID mem-numa · 主责 运维团队·系统运维
在含图示和实验的完整版中打开此卡片 →
在装有两颗 CPU 的服务器上,使用挂在另一颗 CPU 上的内存,访问会变慢。
起因 线程和内存分别位于不同的 CPU 插槽(socket) → 结果 内存访问变慢(视硬件为 1.5~2 倍) → 画面表现 配置相同,各进程的性能却有差异
- 症状
- 慢动作
- 因素
- 停顿
- 谁会遇到
- 全服
- 何时出现
- 一直
- 负责方
- 主责 运维团队·系统运维
- 运维团队要做的事
- 把进程和内存绑定到同一个插槽(numactl);有两个插槽时,按插槽分开部署游戏服务器进程。
- 监控图上
- 仅部分偏高 · 各进程 tick 耗时、各节点内存
- 查看位置
- 用 numastat -p PID 看游戏服务器进程的内存位于哪个 NUMA 节点,看 numastat 的 numa_miss、other_node 是否增长,并与该进程所在 CPU 的节点对比
- 确认依据
- 只有慢的进程大部分内存位于与其运行 CPU 不同的节点上;用 numactl 把 CPU 和内存绑定到同一节点后重启,差异消失
- 排除依据
- 节点分布与快的进程相同却仍然慢,是邻居干扰、CPU 限流、该进程自身负载等其他原因
- 确认手段
- 运维工具即可确认(无需游戏代码)
出处
- What is NUMA? Linux kernel
同一单元(cell)内的内存更快、带宽更大,其他(远端)单元的内存访问更慢 - numactl(8) — Linux manual page numactl
用 --cpunodebind、--membind 把进程的 CPU 和内存绑定到指定 NUMA 节点 - numastat(8) — Linux manual page numactl
numa_miss(分配到了非预期的节点)、other_node(在其他节点上运行的进程在本节点分配内存)计数器;-p 显示进程在各节点的内存
相关原因
同一层:L10 内存
其他层中同样导致“慢动作”的原因
查看含图示和实验的原卡片