透明大页全局开关
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 -10enabled 取值对照
| 取值 | 行为 | 适用场景 |
|---|---|---|
| always | 对所有匿名内存尝试使用大页 | 通用服务默认,可能引入合并开销 |
| madvise | 仅对显式声明的区间使用大页 | 数据库与延迟敏感服务常用 |
| never | 完全不使用大页 | 需要精确控制内存布局时 |
always 模式下 khugepaged 的合并与拆分操作会引入延迟毛刺,选模式前先用业务延迟数据验证。
容器内无法修改宿主全局 THP 设置;规范应写入宿主基线,镜像内部设置影响不到宿主。
确认当前状态的方法
- 读取 enabled 时看方括号的位置,括住的就是当前生效值
- 看 /proc/meminfo 的 AnonHugePages,判断实际用到了多少大页内存
- 看 khugepaged 的 pages_collapsed 与 pages_to_scan,了解合并活跃程度
- 容器内读到的值来自宿主,容器无法独立设置这一开关
修改前先用相同负载建立基线,改完对比延迟分位与吞吐,避免把大页相关的抖动误判成应用侧问题。