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

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

出处

  1. Transparent Hugepage Support Linux kernel
    defrag=always 时,THP 分配失败会当场做内存回收和规整而停住;madvise 只对申请过的区域这样做
  2. Documentation for /proc/sys/vm/ Linux kernel
    min_free_kbytes:内核要保留的最小空闲内存(水位线)基准
  3. PSI - Pressure Stall Information Linux kernel
    /proc/pressure/memory 的 some(部分任务因等待内存而停住的时间比例)、full(所有任务都停住的时间比例)

相关原因

同一层:L7 服务器操作系统(内核)

其他层中同样导致“卡住”的原因

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