Oracle 19c RAC节点重装后必须禁用transparent_hugepage并正确配置HugePages,否则必现崩溃、启动失败及TLB压力高;需永久禁用THP、用hugepages_settings.sh计算nr_hugepages、同步设置hugetlb_shm_group和shmmax/shmall,并设DefaultTasksMax=infinity。
HugePages 配置不正确或 transparent_hugepage 未禁用,是 Oracle 19c RAC 节点重装后频繁崩溃、启动失败、TLB 压力高甚至被驱逐的最常见底层原因之一。这不是“可能有问题”,而是几乎必现的硬性前提条件。
为什么重装节点后必须重配 HugePages 和禁用 transparent_hugepage
重装操作系统会清空所有内核参数、大页预分配状态和内存管理策略。原集群节点依赖的 vm.nr_hugepages、vm.hugetlb_shm_group、kernel.shmall 全部丢失;同时默认开启的 transparent_hugepage=always 会与 oracle 的 use_large_pages=only 冲突,导致实例启动时反复 fallback 到普通页,触发 ora-27102: out of memory 或静默失败——看起来像 crs 启动超时、pmon 挂掉、节点被驱逐。
transparent_hugepage 必须永久禁用(不只是临时)
- 临时禁用(
echo never > /sys/kernel/mm/transparent_hugepage/enabled)在 reboot 后失效,RAC 节点重启即回归异常 - 永久禁用必须修改
/etc/default/grub:在GRUB_CMDLINE_LINUX行末尾追加transparent_hugepage=never - 执行
grub2-mkconfig -o /boot/grub2/grub.cfg后必须reboot,否则内核仍加载 THP - 验证是否生效:
cat /sys/kernel/mm/transparent_hugepage/enabled输出应为[never],且grep AnonHugePages /proc/meminfo应返回AnonHugePages: 0 kB
怎么算对 vm.nr_hugepages 值(别手算!)
直接拿 sga_max_size ÷ 2MB 是典型翻车操作——Oracle SGA 内部有保留区、内存对齐开销、ASM buffer 等额外占用,实测多出 20~40 页很常见。
- 必须在数据库实例已启动状态下运行官方脚本:
$ORACLE_HOME/rdbms/install/hugepages_settings.sh - 脚本输出的是最小推荐值,建议在此基础上 +5% 并向上取整(例如脚本输出 1536 → 实际设 1613)
- 多实例共存(如 RAC 中两个实例)需把各实例脚本输出值相加后再加余量
- 改完
/etc/sysctl.conf后必须执行sysctl -p,并检查输出无报错;若提示error: "vm.nr_hugepages" is an unknown key,说明内核不支持大页,需确认 kernel 版本及架构
三个关键内核参数缺一不可
只设 vm.nr_hugepages 是无效的。以下三项必须同时存在且合规:
-
vm.nr_hugepages = <your_calculated_value></your_calculated_value>:预分配大页总数 -
vm.hugetlb_shm_group = <oinstall_gid></oinstall_gid>:填id -g oinstall查到的 GID,否则grid或oracle用户无法绑定大页 -
kernel.shmmax和kernel.shmall必须 ≥ 所有实例 SGA 总大小(单位字节);shmall单位是页,要换算:SGA 总字节数 ÷ 2048000(2MB)向上取整
漏掉任一参数,ORA-27102 或 ORA-27123 就会准时出现,且 grep Huge /proc/meminfo 显示 HugePages_Free ≈ HugePages_Total——这恰恰说明 Oracle 根本没用上大页,仍在走普通页。
真正容易被忽略的点是:DefaultTasksMax=infinity 在 systemd 系统中不是可选项,而是强制项。RAC 启动涉及大量 fork(),DefaultTasksMax=512(默认)会导致 CRS 进程创建失败、DBCA 卡死、srvctl 报 fork failed with status 11。这个配置必须写进 /etc/systemd/system.conf 并重启 OS,不能跳过。











