数据库类服务在Linux上必须禁用THP,仅改enabled无效;需同步关闭defrag并设置内核参数transparent_hugepage=never,且数据库进程须重启验证。

数据库类服务在Linux上必须禁用THP,只改/sys/kernel/mm/transparent_hugepage/enabled是无效的——defrag和内核启动参数必须同步关闭,否则khugepaged线程仍会后台扫描并触发内存抖动。
确认THP当前是否真正启用
别只看enabled,两个文件都要查:
-
cat /sys/kernel/mm/transparent_hugepage/enabled输出含[always]表示启用;[never]才是禁用 -
cat /sys/kernel/mm/transparent_hugepage/defrag同样必须是[never],否则khugepaged照常运行 - 常见误判:输出为
always [madvise] never—— 这仍是启用状态,方括号标出的才是当前生效项
永久禁用THP的可靠写法(非rc.local)
rc.local 在systemd系统中不可靠,尤其RAC或容器环境易失效。推荐直接改内核参数:
- 编辑
/etc/default/grub,在GRUB_CMDLINE_LINUX末尾追加:transparent_hugepage=never - 执行
grub2-mkconfig -o /boot/grub2/grub.cfg(BIOS)或/boot/efi/EFI/redhat/grub.cfg(UEFI) - 重启生效。该方式优先级最高,覆盖所有运行时设置
- 注意:某些旧版CentOS路径为
/sys/kernel/mm/redhat_transparent_hugepage/,先ls /sys/kernel/mm/*huge*确认路径
验证THP是否退出数据库进程空间
改完配置不等于进程已脱离THP影响,尤其Oracle RAC、MySQL等需显式重启:
- 查进程页使用:
grep -i "anonhugepages\|thp" /proc/$(pgrep -f "mysqld")/smaps | grep -E "(AnonHugePages|MMU)"——AnonHugePages:值应长期为0 - Oracle RAC必须重启整个CRS栈:
crsctl stop crs && crsctl start crs,仅重启DB实例无效 - MongoDB ≤7.0 日志若出现
"WARNING: Detected transparent hugepage support",说明未真正禁用 -
perf stat -e major-faults,minor-faults -p $(pgrep -f "postgres")对比前后,major-faults应明显下降
最容易被忽略的是defrag开关和进程重启动作——很多故障现场查出来enabled已设never,但defrag仍是[always],或者Oracle的ocssd.bin从开机就没重读过内存策略。


















