必须禁用透明大页(thp),否则oracle 11g rac极易发生节点异常重启或i/o延迟飙升(实测吞吐降30%);确认是否启用需检查anonhugepages值是否大于0及/sys/kernel/mm/transparent_hugepage/目录是否存在,仅看enabled文件不可靠;永久禁用唯一可靠方式是修改grub内核参数添加transparent_hugepage=never并重启。
oracle 11g rac 必须禁用透明大页(thp),否则极大概率引发节点异常重启或 i/o 延迟飙升(实测可降 30% 吞吐)——这不是可选项,是上线前强制步骤。
怎么确认透明大页当前是否启用
别只看 /sys/kernel/mm/transparent_hugepage/enabled,它可能显示 [never] 但实际仍生效。关键看内存使用痕迹:
- 运行
grep -i huge /proc/meminfo,若AnonHugePages值 > 0(比如AnonHugePages: 690176 kB),说明 THP 正在动态分配内存,已启用 - 同时检查路径是否存在:
ls /sys/kernel/mm/transparent_hugepage/;若目录存在,就需处理(UEK2+ 内核可能已移除该目录,此时无需操作) - RHEL/CentOS 6/7 和 Oracle Linux 对应路径略有差异:
/sys/kernel/mm/transparent_hugepage/(主流)或/sys/kernel/mm/redhat_transparent_hugepage/(旧 RHEL6)
为什么 echo never > /sys/... 只是临时且不可靠
直接写 /sys/kernel/mm/transparent_hugepage/enabled 只影响当前会话,重启后失效;更严重的是:某些内核版本(如 RHEL 7.6)中,khugepaged 进程会在启动后重新激活 THP,导致你看到 [never] 却仍有 AnonHugePages 持续增长。
- 临时命令仅用于验证:
echo never > /sys/kernel/mm/transparent_hugepage/enabled和echo never > /sys/kernel/mm/transparent_hugepage/defrag - 但生产环境必须从内核启动参数层禁用,否则数据库启动后几小时就可能复现问题
- 不要往
/etc/rc.local里加 echo 命令——RHEL7+ 中rc.local默认不执行,且时机晚于 khugepaged 启动
永久禁用的唯一可靠方式:修改 GRUB 内核参数
这是 Oracle 官方文档(MOS Doc ID 1557478.1)明确推荐的「首选方法」,适用于 RHEL6/7、Oracle Linux 6/7、SLES11+:
- 编辑
/etc/default/grub,在GRUB_CMDLINE_LINUX行末尾追加transparent_hugepage=never,例如:GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet transparent_hugepage=never" - 重新生成 GRUB 配置:
• RHEL7+/CentOS7+:运行grub2-mkconfig -o /boot/grub2/grub.cfg
• RHEL6/CentOS6:运行grub-mkconfig -o /boot/grub/grub.conf(或直接编辑/boot/grub/grub.conf的 kernel 行) - 重启服务器,再执行
grep -i huge /proc/meminfo——AnonHugePages必须为 0 才算真正生效
禁用后还要注意 hugepages 配置冲突
禁用 THP 是前提,但 Oracle RAC 要发挥性能还需启用标准 hugepages(预分配式),而这两者不能共存于同一场景:
- 确认 Oracle 未启用自动内存管理(AMM):
show parameter memory_target和memory_max_target必须为 0;否则 hugepages 会被绕过,THP 禁用也失去意义 -
vm.nr_hugepages值需略大于 SGA 总大小 ÷Hugepagesize(通常为 2048 kB),计算公式:向上取整(SGA_MB × 1024 ÷ 2) + 50~100 页余量 - 修改
/etc/sysctl.conf后必须执行sysctl -p,且需重启数据库(不是仅重启实例)才能让 Oracle 绑定到 hugepages
最容易被忽略的一点:禁用 THP 后,/proc/meminfo 里的 HugePages_Total 和 HugePages_Free 仍可能非零——这属于标准 hugepages 预分配结果,只要 AnonHugePages 为 0 就代表 THP 已关闭成功;别误判成没生效。











