THP 整理策略
THP 的 defrag 设置决定为了凑出 2MiB 大页,内核是否愿意做内存整理。取值有四个:always 表示同步整理,可能造成明显的延迟尖峰;defer 让内核在后台异步整理;madvise 仅对应用声明了 MADV_HUGEPAGE 的区间整理;never 完全不整理。它与 enabled 是两个独立开关,只改其中一个往往达不到预期效果,应一起评估。
基本信息
| 路径 | /sys/kernel/mm/transparent_hugepage/defrag |
|---|---|
| 取值 | always、defer、madvise、never |
| 配套开关 | 同目录下的 enabled |
| 建议 | 延迟敏感服务用 madvise 或 never |
| 观测 | /proc/vmstat 中的 thp_ 前缀计数 |
典型使用场景
- 排查延迟毛刺时确认是否为 THP 整理所致
- 数据库等延迟敏感服务调整 THP 行为
- 在提高大页命中率与降低整理代价之间取舍
- 与 enabled 一起设计整体 THP 策略
- 对比调整前后的延迟分位数据
查看与调整
查看与调整
cat /sys/kernel/mm/transparent_hugepage/defrag
cat /sys/kernel/mm/transparent_hugepage/enabled
grep -E 'thp_' /proc/vmstat | head -12
grep -E 'thp' /proc/vmstat | grep -i -E 'fault|alloc' | head
cat /sys/kernel/mm/transparent_hugepage/khugepaged/scan_sleep_millisecs
echo defer | sudo tee /sys/kernel/mm/transparent_hugepage/defrag取值与代价
| 取值 | 行为 | 代价 |
|---|---|---|
| always | 同步整理,尽量凑出大页 | 延迟尖峰明显 |
| defer | 后台异步整理 | 大页获取有一定延迟,冲击更平滑 |
| madvise | 仅对声明的区间整理 | 可控性最好 |
| never | 不整理 | 大页命中率低,但延迟更稳定 |
把 defrag 为 always 造成的毛刺误判成应用 GC 或锁竞争很常见,排查延迟问题时先核对这组开关。
defrag 与 enabled 是两套开关:只改其中一个往往达不到预期效果,应成对评估。
落地建议
- 先读 enabled 与 defrag 的当前值,两个开关一起判断
- 延迟敏感服务建议全局设为 madvise,由应用声明需要大页的区间
- 需要大页但要延迟稳定时选择 defer,避免同步整理带来的尖峰
- 修改后对比延迟分位与吞吐,确认收益再固化进基线
- 容器内读到的设置来自宿主,规范应写入宿主基线
与相邻设置的关系
- enabled 决定是否使用大页,defrag 决定是否为大页做整理
- khugepaged 的后台合并受扫描间隔等参数影响,属于另一条路径
- 静态大页与透明大页是两套机制,对延迟有硬要求时应优先考虑静态大页