必须同时检查/sys/kernel/mm/transparent_hugepage/enabled和defrag两个文件,且二者输出均含[never]才算真正关闭THP;仅enabled为[never]而defrag非[never]时,khugepaged仍会后台扫描导致卡顿。

cat /sys/kernel/mm/transparent_hugepage/enabled 看不到 [never] 就不算关
这个文件只显示 THP 的“启用策略”,但括号 [ ] 里的值才是当前生效模式。输出类似 always [madvise] never,说明实际是 madvise;只有 always madvise [never] 才代表真正禁用。
常见错误是看到输出里有 never 就以为关了,其实它可能只是列表中的一项,没被选中。
- 必须用
cat直接读取,不能靠grep never判断 - 非 root 用户执行会提示
Permission denied,得切 root 或加sudo - 该文件不反映内核是否正在合并内存——它只管“要不要响应应用建议”,不管后台行为
cat /sys/kernel/mm/transparent_hugepage/defrag 必须同步检查
defrag 控制 khugepaged 守护进程是否主动扫描、合并小页。即使 enabled 是 [never],只要 defrag 是 [always] 或 [defer+madvise],khugepaged 仍会周期性唤醒,导致数据库卡顿、延迟抖动。
验证时两条命令缺一不可:
cat /sys/kernel/mm/transparent_hugepage/enabledcat /sys/kernel/mm/transparent_hugepage/defrag
两行输出都必须出现 [never],才算 THP 实际停用。
grep -i huge /proc/meminfo 看有没有真在用大页
这个命令能告诉你内核当前是否分配了透明大页内存,比查配置更接近真实状态。
重点关注 AnonHugePages 字段:
- 值为
0 kB:没有匿名内存走 THP(好消息) - 非零(如
2048 kB或更大):THP 正在参与内存分配,哪怕配置写了never,也可能被运行时覆盖
注意:HugePages_Total 和 HugePages_Free 属于标准大页(HP),和 THP 无关,别混淆。
ps + grep + /proc/$pid/status 查具体进程是否启用 THP
数据库或 Java 进程是否真受 THP 影响,不能只看系统级开关。例如 MySQL 即使系统开了 always,默认也不主动申请 THP,但某些堆分配路径仍可能触发。
查一个运行中的 mysqld 进程:
- 先拿到 PID:
pgrep -f mysqld | head -1 - 再查状态:
grep -i huge /proc/$(pgrep -f mysqld | head -1)/status
如果输出含 MMUPageSize: 2048 或 THP_enabled: 1(取决于内核版本),说明该进程地址空间里已有 THP 映射。否则大概率没用上。
这个检查容易被忽略:你关了全局 THP,但某个容器或 systemd service 启动时又通过 echo 临时打开了它,只查系统文件会误判。


















