ora-27102报错主因是vm.nr_hugepages未正确配置,而非内存不足;需确保rac所有节点该值一致且足够,同时配套设置vm.hugetlb_shm_group、kernel.shmall/shmmax及memlock限制,并验证hugepages_rsvd>0。
oracle 19c rac 实例启动失败,报 ora-27102: out of memory,但系统空闲内存充足?八成是 vm.nr_hugepages 没配对,不是内存真不够,而是 oracle 拒绝 fallback 到普通页——use_large_pages=only 下,大页池空或不足,直接退出。
为什么 hugepages_settings.sh 输出值不能直接抄进 sysctl.conf
脚本输出的是“当前实例已分配内存映射”推算出的最小值,但 RAC 启动时有额外开销:ASM buffer、CRS 进程共享段、LMS/LMD 的 IPC 区域、甚至某些补丁引入的隐藏保留区。实测常见偏差 20~40 页(约 40–80MB)。手算更危险:sga_max_size / 2048 忽略了单位换算(SGA 是字节,2MB = 2048 KB)、没加对齐余量、更没考虑多实例叠加。
- 必须在所有 RAC 实例均已
STARTUP状态下运行脚本,路径是$ORACLE_HOME/rdbms/install/hugepages_settings.sh(不是admin/) - 若节点有多个实例(如主库+ADG),分别在各实例下运行脚本,把输出的
recommended nr_hugepages值相加,再统一加 5% 向上取整 - 脚本输出为 0?检查
ps -ef | grep pmon是否真有实例在跑,以及 oracle 用户是否能读/proc/<pid>/maps</pid>
vm.nr_hugepages 设太小或太大都会出事
设小了:启动时报 ORA-27102 或静默失败;设大了:系统启动时预分配失败,sysctl -p 报错 "vm.nr_hugepages" is an unknown key,或导致后续无法分配其他内存(尤其 RHEL9+ 内核对大页管理更严格)。
- 确认内核支持:执行
grep -i huge /proc/cpuinfo(需含pdpe1gb或ht),再查cat /proc/meminfo | grep Huge看是否有HugePages_Total字段 - 设值后必须立刻执行
sysctl -p,且检查返回无 error;若提示 key unknown,说明内核未启用 CONFIG_HUGETLB_PAGE=y 编译选项 - RHEL9.6+ 上,
vm.nr_hugepages超过物理内存 75% 可能触发 OOM killer(尤其当vm.swappiness=0时),主机反复重启——这不是配置错误,而是资源水位误判
启动前必须验证的三个配套项
只改 vm.nr_hugepages 是白忙。RAC 启动时会校验三者是否同时就位,缺一不可:
-
vm.hugetlb_shm_group:必须设为oinstall组 ID(id -g oinstall查),否则 grid/oracle 用户无法挂载大页共享段 -
kernel.shmall和kernel.shmmax:两者都必须 ≥ SGA 大小(单位:bytes)。shmall是总页数上限,shmmax是单个段上限;常见错误是只调大shmmax却漏了shmall -
memlock限制:在/etc/security/limits.d/oracle-database-preinstall-19c.conf中,oracle soft memlock和hard memlock都要设为unlimited或至少 ≥sga_max_size(单位 KB)
怎么确认大页真被 Oracle 锁定了
启动后别光看 HugePages_Total,重点看分配状态。Oracle 只有在实例真正完成 SGA 初始化后,才会把页从 HugePages_Free 移到 HugePages_Rsvd。
- 执行
grep Huge /proc/meminfo,确认HugePages_Rsvd > 0且接近HugePages_Total(差值 ≤ 2 页正常) - 查 alert 日志里是否有
WARNING: Large page allocation failed—— 有则说明部分 SGA 仍用了普通页,use_large_pages=only实际退化为auto - 用
ipcs -m看共享内存段,Key 列若显示0x00000000或大小异常小,大概率是大页没锁住,进程 fallback 了
最易被忽略的是:RAC 多节点间 vm.nr_hugepages 值必须完全一致,哪怕物理内存总量不同——因为 OCR/voting disk 元数据和集群心跳共享段也走大页,不一致会导致节点驱逐。别信“这台少配点没关系”。











