ORA-27102启动失败主因是vm.nr_hugepages配置错误或配套参数缺失,必须在所有RAC实例STARTUP后运行hugepages_settings.sh取推荐值、相加后上浮5%并向上取整,同时配齐vm.hugetlb_shm_group、kernel.shmmax/shmall、memlock unlimited及禁用THP,且HugePages_Rsvd>0才真正生效。
oracle rac 实例启动报 ora-27102: out of memory,但系统空闲内存充足?这不是内存真不够,而是 vm.nr_hugepages 没配对,或配套参数缺失——改完就跑 startup 是无效的,必须验证 hugepages_rsvd > 0 才算真正生效。
为什么 hugepages_settings.sh 输出值不能直接写进 /etc/sysctl.conf
脚本输出的是当前已运行实例映射出的最小页数,但 RAC 启动时有额外开销:ASM buffer、CRS 共享段、LMS/LMD 的 IPC 区域、某些补丁引入的保留区。实测多出 20~40 页很常见。手算更危险:sga_max_size / 2048 忽略了单位换算(SGA 是字节,2MB = 2048 KB)、没加对齐余量、更没考虑多实例叠加。
- 必须在所有 RAC 实例均已
STARTUP状态下运行脚本:$ORACLE_HOME/rdbms/install/hugepages_settings.sh(注意是install/,不是admin/) - 若节点有多个实例(如主库 + ADG),分别运行脚本,把各
Recommended setting: vm.nr_hugepages=XXXX值相加,再统一上浮 5% 并向上取整(例如 3120 → 3276) - 脚本输出为 0?检查
ps -ef | grep pmon是否真有实例在跑,以及oracle用户是否能读/proc/<pid>/maps
只改 vm.nr_hugepages 为什么 Oracle 还是不用大页
Oracle 启动时会校验四项参数是否同时就位,缺一不可。仅写 vm.nr_hugepages 到 /etc/sysctl.conf,大概率静默降级回普通页——此时 grep Huge /proc/meminfo 显示 HugePages_Free 接近 HugePages_Total,就是典型假象。
-
vm.hugetlb_shm_group = <oinstall_gid>:必须设为oinstall组 ID(用id -g oinstall查),否则grid/oracle用户无权挂载大页共享段 -
kernel.shmmax和kernel.shmall必须 ≥ 当前实例 SGA 实际大小(单位:字节 / 页)。shmall × 4096要 ≥ 物理内存;shmall × 2048 × 1024要 ≥ SGA 总量(单位 MB) -
memlock必须为unlimited:检查ulimit -l,并在/etc/security/limits.conf中为oracle用户显式设置oracle soft memlock unlimited和oracle hard memlock unlimited - 改完后必须执行
sysctl -p,且确认输出无 error;若提示"vm.nr_hugepages" is an unknown key,说明内核未启用CONFIG_HUGETLB_PAGE=y
为什么 sysctl -p 成功了,但 Oracle 还是启动失败
关键信号不是 HugePages_Total 有值,而是 HugePages_Rsvd > 0 且 HugePages_Free 显著下降(例如只剩个位数)。RHEL9.6+ 上,vm.nr_hugepages 超过物理内存 75% 可能触发 OOM killer(尤其当 vm.swappiness=0 时),主机反复重启——这不是配置错误,而是资源水位误判。
- 禁用
transparent_hugepage必须永久:修改/etc/default/grub,在GRUB_CMDLINE_LINUX行末尾追加transparent_hugepage=never,再执行grub2-mkconfig -o /boot/grub2/grub.cfg并reboot - 验证是否生效:
cat /sys/kernel/mm/transparent_hugepage/enabled输出应为[never],且grep AnonHugePages /proc/meminfo应返回AnonHugePages: 0 kB - RAC 所有节点的
vm.nr_hugepages、vm.hugetlb_shm_group、kernel.shmall必须完全一致,否则一个节点先占满大页,其他节点启动即失败 - 改完参数后不重启、不重载 CRS,只重启数据库实例是无效的;必须确保 CRS 已用新内核参数启动
最容易被忽略的点是:RAC 启动顺序依赖 CRS,而 CRS 自身也占用大页。哪怕所有数据库参数都对,只要 CRS 进程没拿到大页,后续实例就无法分配——所以验证必须在 crsctl start crs 完成后、再启动数据库前,检查 HugePages_Rsvd 是否已开始增长。


















