必须永久关闭Transparent HugePages,否则Oracle实例在高并发或RAC环境下可能异常重启、SGA分配延迟、AnonHugePages占用内存却无法使用;需通过GRUB添加transparent_hugepage=never并重启验证,仅echo临时关闭不可靠。

Transparent HugePages 必须关,否则 Oracle 实例可能在高并发或 RAC 环境下出现节点异常重启、SGA 分配延迟、AnonHugePages 占用内存却无法被 Oracle 使用等问题。永久关闭是唯一可靠方式,临时关闭(echo)在重启后失效,且部分内核版本不支持运行时禁用。
确认当前是否启用 Transparent HugePages
先看状态再操作,避免误判:
- 执行
cat /sys/kernel/mm/transparent_hugepage/enabled(RHEL7+/OEL7+)或cat /sys/kernel/mm/redhat_transparent_hugepage/enabled(RHEL6/OEL6),输出含[always]表示已启用 - 再查
grep AnonHugePages /proc/meminfo,若值非零(如AnonHugePages: 2048 kB),说明内核正在分配透明大页 - 注意:某些新版 UEK 内核已移除该接口,
/sys/kernel/mm/transparent_hugepage/目录不存在即代表 THP 已禁用
永久关闭:修改 GRUB 命令行参数
临时写 /sys 节点只能维持到下次重启,且部分系统(如启用了 Secure Boot 的 RHEL8+)会拒绝运行时修改。必须走 GRUB 永久生效:
- RHEL7/OEL7:编辑
/etc/default/grub,在GRUB_CMDLINE_LINUX行末尾追加transparent_hugepage=never,例如:GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=rhel/root ... quiet transparent_hugepage=never" - RHEL6/OEL6:编辑
/boot/grub/grub.conf或/etc/grub.conf,在 kernel 行末尾加相同参数 - 生成新配置:
• EFI 系统(如 RHEL7 UEFI 安装):运行grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
• BIOS 系统:运行grub2-mkconfig -o /boot/grub2/grub.cfg
重启后验证是否真正关闭
重启不是可选项,是必要步骤;未重启,内核仍按旧参数加载:
- 重启后再次运行
cat /sys/kernel/mm/transparent_hugepage/enabled,应显示[never](方括号在 never 上) - 再执行
grep AnonHugePages /proc/meminfo,结果必须为AnonHugePages: 0 kB - 如果仍是非零值,说明 GRUB 修改未生效——常见原因是没运行
grub2-mkconfig,或路径写错(比如误写成/boot/grub/grub.cfg) - 注意:有些云厂商定制镜像(如 Alibaba Cloud 部分 CentOS7 镜像)默认禁用 THP,但需仍验证
AnonHugePages是否为 0,不能只信文档
为什么不能只靠 echo 命令临时关闭?
看似快捷的 echo never > /sys/kernel/mm/transparent_hugepage/enabled 在多数生产环境不可靠:
- Oracle 启动前若
AnonHugePages已非零,后续 SGA 分配可能仍被干扰,即使你 echo 过 - systemd 服务(如
oracle-rdbms-server-12cR1-preinstall)可能在启动时重置该值 - RHEL8+ 默认使用
kernelstub或dracut管理启动参数,/sys 接口写入常被覆盖 - 最关键:RAC 环境中,一个节点临时关闭而另一个没关,会导致集群心跳超时、fencing 触发——必须所有节点统一 GRUB 级别禁用
ksm: page allocation failure。


















