游戏卡顿白皮书 › L7 服务器操作系统(内核)
内存回收/规整导致的停顿 Memory compaction / reclaim stalls (THP)
原因 ID so-reclaim · 主责 运维团队·系统运维 · 配合 研发团队·服务器开发
在含图示和实验的完整版中打开此卡片 →
操作系统为了凑出大页(huge page)而做内存规整,或为补充空闲内存而回收内存时,进程会停住。
起因 空闲内存减少,或大页功能(THP)触发内存规整 → 结果 申请内存的线程要一直等到回收或规整结束 → 画面表现 不规则的服务器停顿(几 ms 到几百 ms)
- 症状
- 卡住, 一卡一卡
- 因素
- 停顿
- 谁会遇到
- 全服
- 何时出现
- 开得越久越严重, 偶尔随机
- 负责方
- 主责 运维团队·系统运维 · 配合 研发团队·服务器开发
- 研发团队要做的事
- 减少运行期间的大块内存分配(启动时预先申请好,之后复用)。
- 运维团队要做的事
- 把大页(THP)设为只在需要的地方使用(madvise);提高空闲内存基准(vm.min_free_kbytes 等)。
- 监控图上
- 偶发随机尖峰 · 服务器 tick 耗时、内存 PSI
- 查看位置
- 把 /proc/pressure/memory 的 some、full(因等待内存而停住的时间比例)和 /proc/vmstat 中 compact_stall 的增量与服务器 tick 耗时一起看,并确认 /sys/kernel/mm/transparent_hugepage/defrag 的设置
- 确认依据
- tick 冲高的时刻内存 PSI 上升,compact_stall 增加。defrag 为 always
- 排除依据
- PSI 和 compact_stall 没有变化则不是这个原因。swap 用量增加,看“swap”
- 确认手段
- 运维工具即可确认(无需游戏代码)
出处
- Transparent Hugepage Support Linux kernel
defrag=always 时,THP 分配失败会当场做内存回收和规整而停住;madvise 只对申请过的区域这样做 - Documentation for /proc/sys/vm/ Linux kernel
min_free_kbytes:内核要保留的最小空闲内存(水位线)基准 - PSI - Pressure Stall Information Linux kernel
/proc/pressure/memory 的 some(部分任务因等待内存而停住的时间比例)、full(所有任务都停住的时间比例)
相关原因
同一层:L7 服务器操作系统(内核)
其他层中同样导致“卡住”的原因
查看含图示和实验的原卡片