必须修改内核启动参数transparent_hugepage=never并重启系统,仅echo never>/sys/或rc.local不可靠;需验证/proc/cmdline含该参数且/proc/meminfo中anonhugepages: 0 kb,数据库进程(如oracle rac需重启crs)也须重启。

必须改内核启动参数,其他方法都不可靠——echo never > /sys/ 只是临时验证,rc.local 在 systemd 系统里大概率不执行,/etc/sysctl.conf 根本不生效。
怎么确认 THP 实际还在运行
别只看 /sys/kernel/mm/transparent_hugepage/enabled 里是不是显示 [never]。真正起作用的是两个硬指标:
-
grep AnonHugePages /proc/meminfo输出值必须为AnonHugePages: 0 kB,大于 0 就说明 khugepaged 正在后台分配大页 -
cat /proc/cmdline输出里必须含transparent_hugepage=never,否则内核根本没加载这个策略 - 旧系统(如 RHEL6)可能用的是
/sys/kernel/mm/redhat_transparent_hugepage/,先ls /sys/kernel/mm/*huge*确认路径
为什么 echo never > /sys/ 不算真正禁用
这个操作只改运行时状态,重启即失效;更危险的是,在 RHEL7.6+ 等内核中,khugepaged 进程会在系统启动后自动重开 THP,哪怕你看到 enabled 是 [never],AnonHugePages 仍会持续增长。
-
defrag也必须同步设为never:echo never > /sys/kernel/mm/transparent_hugepage/defrag - 临时命令仅用于验证:设完立即查
AnonHugePages是否归零,不归零说明还有其他机制在干预 - Oracle MOS Doc ID 1557478.1 明确指出:唯一可靠方式是修改 GRUB 内核参数
永久禁用 THP 的实操步骤(RHEL/CentOS 7+)
编辑 /etc/default/grub,在 GRUB_CMDLINE_LINUX 行末尾追加 transparent_hugepage=never,例如:
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root ... quiet transparent_hugepage=never"
- 执行
grub2-mkconfig -o /boot/grub2/grub.cfg(BIOS)或/boot/efi/EFI/redhat/grub.cfg(UEFI) - 必须重启,不能跳过 —— 否则新参数不会加载
- 重启后立刻验证:
cat /proc/cmdline | grep transparent_hugepage和grep AnonHugePages /proc/meminfo
数据库进程必须重启才能脱离 THP 影响
改完内核参数 ≠ Oracle 进程已切换内存策略。尤其 RAC 环境下,ocssd.bin、crsd.bin 等 CRS 进程从开机起就按旧策略分配内存,不重启就永远卡在 THP 里。
- 单实例:重启数据库实例即可,
sqlplus / as sysdba执行shutdown immediate; startup; - RAC:必须重启整个 CRS 栈:
crsctl stop crs && crsctl start crs,仅重启 DB 实例无效 - 验证进程级效果:
grep AnonHugePages /proc/$(pgrep -f "ora_pmon")/smaps,输出应长期为 0
最容易被忽略的是 defrag 开关没关、CRS 没重启、以及以为 /proc/cmdline 里有参数就万事大吉——其实得亲眼看到 AnonHugePages 归零且稳定不涨,才算真正落地。











