首页/系统/Linux 内核与性能调优速查/THP defrag 碎片整理策略
内存与 OOM58 条

THP defrag 碎片整理策略

defrag 决定为凑 2MiB 大页是否同步整理内存:always/defer/madvise/never;always 可能造成明显延迟尖峰,defer 后台异步处理。

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 的后台合并受扫描间隔等参数影响,属于另一条路径
  • 静态大页与透明大页是两套机制,对延迟有硬要求时应优先考虑静态大页

易错点

  • 只改 enabled 不改 defrag:同步整理造成的毛刺依旧存在
  • 把 always 的毛刺误判为应用问题:排查时漏掉内核开关这一层
  • 在容器内修改:实际改到的是宿主全局设置
  • 改完不做延迟对比:无法证明收益,也无法回退
  • 期望 never 下仍有大页收益:不做整理时命中率会明显下降

数据来源与参考

  • Linux 内核 Documentation/admin-guide/mm/transhuge.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌