首页/系统/Linux 内核与性能调优速查/Transparent HugePage 全局开关
内存与 OOM58 条

Transparent HugePage 全局开关

/sys/kernel/mm/transparent_hugepage/enabled 控制 THP:always 全局启用、madvise 仅对声明区间启用、never 关闭;数据库类负载常选 madvise/never。

透明大页全局开关

Transparent HugePage(THP)让内核自动使用 2MiB 大页,以减少 TLB 缺失。全局开关 /sys/kernel/mm/transparent_hugepage/enabled 有三个取值:always 全局启用、madvise 仅对应用显式声明的内存区间启用、never 完全关闭。数据库等对延迟抖动敏感、希望掌控内存布局的负载常选 madvise 或 never;通用服务保持默认通常即可。运行时写入重启后失效,需要靠服务或内核参数固化。

基本信息

路径/sys/kernel/mm/transparent_hugepage/enabled
取值always、madvise、never
配套开关defrag(另一组取值,控制是否同步整理)
观察/proc/meminfo 的 AnonHugePages 与 khugepaged 统计
持久化需通过服务单元或内核参数,运行时写入重启失效

典型使用场景

  • 数据库实例按官方文档建议关闭或改为 madvise
  • 排查 khugepaged 合并与拆分带来的延迟毛刺
  • 内存密集型服务评估大页收益
  • 统一大批量机器的内核基线
  • 确认容器看到的设置实际来源是宿主

查看与临时切换

查看与临时切换
cat /sys/kernel/mm/transparent_hugepage/enabled     # 方括号内是当前生效值
cat /sys/kernel/mm/transparent_hugepage/defrag
cat /sys/kernel/mm/transparent_hugepage/khugepaged/pages_collapsed
grep -i -E 'AnonHugePages|Hugepagesize' /proc/meminfo
echo madvise | sudo tee /sys/kernel/mm/transparent_hugepage/enabled   # 临时切换
grep -E 'thp' /proc/vmstat | head -10

enabled 取值对照

取值行为适用场景
always对所有匿名内存尝试使用大页通用服务默认,可能引入合并开销
madvise仅对显式声明的区间使用大页数据库与延迟敏感服务常用
never完全不使用大页需要精确控制内存布局时
always 模式下 khugepaged 的合并与拆分操作会引入延迟毛刺,选模式前先用业务延迟数据验证。
容器内无法修改宿主全局 THP 设置;规范应写入宿主基线,镜像内部设置影响不到宿主。

确认当前状态的方法

  • 读取 enabled 时看方括号的位置,括住的就是当前生效值
  • 看 /proc/meminfo 的 AnonHugePages,判断实际用到了多少大页内存
  • 看 khugepaged 的 pages_collapsed 与 pages_to_scan,了解合并活跃程度
  • 容器内读到的值来自宿主,容器无法独立设置这一开关
修改前先用相同负载建立基线,改完对比延迟分位与吞吐,避免把大页相关的抖动误判成应用侧问题。

易错点

  • always 模式下忽略 khugepaged 开销:延迟毛刺被误判为应用缺陷
  • 在容器里改 THP:实际改动落在宿主全局并影响其他容器
  • 只改 enabled 不看 defrag:两个开关共同决定是否同步整理,需一起评估
  • 运行时写入就以为完成:重启后失效,必须通过服务或内核参数固化
  • never 模式下仍期待大页收益:全局关闭后应用侧声明也不会生效

数据来源与参考

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