rac中不能仅设lock_sga=true,须同步配置ulimit -l≥sga_max_size、禁用amm、启用hugepages且关闭thp;否则启动报ora-27102,因内核限制内存锁定。
不能直接在rac中只设 lock_sga=true 就完事——它会启动失败,且必须和操作系统级内存锁、hugepages、amm禁用三者联动才可能生效。
为什么 RAC 启动时加了 lock_sga=true 会报 ORA-27102?
根本原因是 Linux 内核限制了每个进程能锁定的物理内存上限(ulimit -l),而 RAC 每个节点的 SGA 通常远超默认的 64KB 或 32KB。数据库启动时尝试锁定整个 SGA,但被内核拒绝,直接报 Cannot allocate memory。
-
ulimit -l值必须 ≥sga_max_size(单位 KB),建议设为unlimited或精确计算后略大 - 该限制需对
oracle用户生效,且要写入/etc/security/limits.conf,不是仅当前 shell 里执行ulimit - RAC 所有节点都得同步配置,否则某个节点启动成功、另一个失败,集群无法形成
lock_sga 和 pre_page_sga 在 RAC 中是否推荐启用?
Oracle 官方文档明确指出:lock_sga 与自动内存管理(AMM)互斥,而 RAC 环境中 AMM(即 memory_target)本身就不被支持——所以你本就该用 ASMM(sga_target + pga_aggregate_target)。但这不等于推荐开 lock_sga。
-
lock_sga=true强制 SGA 锁定在物理内存,但会占用mlock()资源,且无法动态收缩;RAC 实例重启或故障转移时易因内存不足卡住 -
pre_page_sga=true在启动时预读全部 SGA 页,显著拖慢启动时间(尤其 SGA > 8GB 时),且对运行时性能提升有限 - 真正推荐的替代方案是配置 HugePages:它天然不可 swap、TLB 效率高,且 Oracle RAC 官方完整支持
更可靠的做法:用 HugePages 替代 lock_sga
HugePages 是 Linux 内核提供的 2MB(或 1GB)大页机制,Oracle 进程可直接绑定使用,完全绕过 swap,且比 lock_sga 更稳定、更省 CPU。
- 必须先禁用透明大页(THP):
echo never > /sys/kernel/mm/transparent_hugepage/enabled - 关闭 AMM:
alter system set memory_target=0 scope=spfile(RAC 所有节点都要做) - 用 Oracle 提供的
hugepages_settings.sh脚本计算所需页数,公式本质是ceil((SGA_MAX_SIZE + 100MB) / 2048KB) - 设置
vm.nr_hugepages并验证:grep HugePages_ /proc/meminfo,确保HugePages_Free≥ 计算值 - 无需改
lock_sga,Oracle 启动时自动优先使用 HugePages(前提是 SGA 分配未超限)
容易被忽略的关键点
很多人以为只要 lock_sga=true + ulimit -l unlimited 就万事大吉,但实际漏掉了三个硬性前提:
- RAC 所有节点的
oracle用户必须属于同一组(如dba),且该组在/etc/security/limits.conf中有独立memlock条目 - 若使用 ASM,
grid用户也需同样配置ulimit -l,否则 CRS 启动时可能因 ASM 实例锁内存失败而中断 -
pre_page_sga=true会导致数据库启动阶段大量读盘,如果备份窗口和启动时间重叠,IO 尖峰可能触发存储告警











