kernel.shmmax和kernel.shmall设置错误会导致CRS启动失败:shmmax须≥单节点SGA_MAX_SIZE且≥物理内存一半,shmall须≥shmmax/4096;值不一致或过小将引发ORA-27102、OCR初始化静默失败或实例无法attach共享内存。

kernel.shmmax 和 kernel.shmall 设置不对会导致 CRS 启动失败
Oracle RAC 的 Cluster Ready Services(CRS)依赖大块共享内存段启动,kernel.shmmax 必须 ≥ 单节点 SGA_MAX_SIZE,且建议 ≥ 物理内存的一半;kernel.shmall 则需 ≥ shmmax / page_size(通常 page_size=4096)。常见错误是直接照抄文档最小值(如 kernel.shmmax = 4294967295),但在 64 位系统上若物理内存为 128GB,该值反而会限制 SGA 扩展——此时应设为 137438953471(128×1024³−1)。
验证方式:cat /proc/sys/kernel/shmmax 和 getconf PAGE_SIZE;修改后必须执行 sysctl -p,且重启前用 ipcs -lm 确认生效。
- 不要在
/etc/sysctl.conf中用变量或计算式(如kernel.shmmax = $((128*1024*1024*1024-1))),sysctl 不解析 shell 表达式 - 若使用 HugePages,
kernel.shmmax可设为 0(由vm.nr_hugepages控制),但需同步禁用 AMM(memory_target=0) - RAC 多节点环境要求所有节点
shmmax值完全一致,否则 OCR 初始化可能静默失败
net.ipv4.ip_local_port_range 过窄会引发连接耗尽和 TNS-12535
RAC 节点间频繁通信(如 GES/GCS 消息、OCR 检查、ASM 实例心跳)大量使用临时端口。默认的 60000–65535 仅提供 5536 个端口,高并发下极易耗尽,表现为客户端连接超时、TNS-12535: TNS:operation timed out 或 ORA-12170: TNS:Connect timeout occurred。
推荐设为 net.ipv4.ip_local_port_range = 9000 65500(56501 个可用端口),该范围避开知名端口(1–1023)、注册端口(1024–49151)和 Oracle 默认监听端口(1521),也兼容多数防火墙策略。
- 该参数只影响本地发起的连接(如 node1→node2 的集群心跳),不影响监听器接收的连接
- 修改后无需重启网络服务,但已有 ESTABLISHED 连接不受影响;新连接立即生效
- 若同时启用 HAIP(11.2+)或 GNS,建议额外保留 1000+ 端口余量,避免 HAIP VIP 切换时端口争抢
私网网卡的 rp_filter 必须设为 0,否则节点心跳丢包
RAC 私网(如 eth1/bond1)承载 Cache Fusion 数据块传输和集群心跳,严格依赖对称路由。Linux 默认开启反向路径过滤(rp_filter=1),当私网流量经某接口入、却从另一接口出(如因多网卡绑定或策略路由),内核会直接丢弃该包,导致 cssd.bin 日志中持续出现 clssnmvDHBValidateNCopy: node X, DHB has not been received from node Y,最终触发节点驱逐(eviction)。
正确做法是在 /etc/sysctl.conf 中显式关闭:
net.ipv4.conf.eth1.rp_filter = 0
net.ipv4.conf.bond1.rp_filter = 0
注意:不能只写 net.ipv4.conf.all.rp_filter = 0,RAC 场景下必须按接口名精确指定。
- 设置后需运行
sysctl -p,并用sysctl net.ipv4.conf.eth1.rp_filter确认返回 0 - 某些发行版(如 OL7/8)默认启用
net.ipv4.conf.all.rp_filter = 2(loose mode),仍可能导致私网异常,必须覆盖 - 公网上可保持
rp_filter=1,不影响安全性
fs.aio-max-nr 和 fs.file-max 不足会卡在 root.sh 执行阶段
运行 root.sh 时,Oracle 自动配置 ASM、OCR、Voting Disk 等资源,大量并发异步 I/O 操作(尤其是 ASM disk discovery)依赖 fs.aio-max-nr;而 CRS 进程、监听器、数据库实例合计打开的文件描述符远超单进程限制,依赖全局 fs.file-max。若值过低,root.sh 会在 “Creating OCR keys for user ‘oracle’…” 步骤长时间无响应,crsctl check crs 显示 CRS-4638: Oracle High Availability Services is online 但后续服务全未启动。
最低要求:
fs.aio-max-nr = 1048576(100 万 AIO 请求并发)
fs.file-max = 6815744(约 680 万文件句柄)
生产环境建议翻倍,尤其使用大量 ASM disk 或 NFS 存储时。
-
fs.aio-max-nr是系统级硬上限,不可运行时动态调高(需重启),务必一次设足 -
fs.file-max可运行时调整(sysctl -w fs.file-max=...),但root.sh阶段已读取初始值,改了也要重跑 - 别漏掉用户级限制:oracle 用户的
ulimit -n和ulimit -i也需同步设为 ≥65536
rp_filter 的接口粒度控制和 shmmax 在多节点间的数值一致性——前者导致集群看似正常实则心跳脆弱,后者让 OCR 创建成功但后续实例无法 attach 共享内存段,问题表象都像“随机失败”,排查时往往绕弯很久。


















