Oracle RAC重负载下脑裂的根本原因是ocssd.bin进程受CPU、内存、I/O三重挤压导致调度延迟,使网络心跳超时(misscount)被击穿,进而触发仲裁;此时disktimeout常同步失效,节点被迫自裁。

Oracle RAC在重负载下因心跳网络延迟触发脑裂,根本不是“网络断了”,而是ocssd.bin进程被系统资源反噬,导致心跳包实际发出/接收超时——misscount被击穿后,集群立刻进入仲裁流程,而此时disktimeout往往也已失效,节点只能自裁。
ocssd.bin调度延迟:CPU、内存、I/O三重挤压的真实表现
当top -p $(pgrep ocssd)显示%CPU持续>80%且TIME+每秒暴涨,说明ocssd.bin正在被调度器反复推迟执行。这不是配置问题,是资源争抢的硬约束:
- CPU满载时,Linux CFS调度器无法保证
ocssd.bin每秒准时唤醒,网络心跳发送延迟直接累积 - 内存严重swap时,
ocssd.bin堆内存被换出,恢复需毫秒级等待,数次叠加就突破misscount(默认30秒) - Voting Disk所在ASM磁盘组I/O队列深度>10、平均延迟>150ms,
clssnmCheckDskInfo写票失败或超时,CSSD判定“磁盘心跳不可靠”,转而更依赖本已不稳的网络心跳
HAIP子接口未就位:私网UDP通信失败的静默前兆
ora.cluster_interconnect.haip资源反复OFFLINE,不代表网线不通,而是HAIP根本没完成初始化。关键检查点不是ping,而是确认底层UDP通路是否就绪:
- 执行
ifconfig -a | grep 169.254,若无eth1:1或enp0s9:1类子接口,说明HAIP连绑定都没成功 - 查
$GRID_HOME/log/<hostname>/cssd/ocssd.log,出现has a disk HB, but no network HB即锁定UDP层失败 -
arping -I eth1 -c 3 169.254.10.10失败?立即检查sysctl net.ipv4.conf.eth1.rp_filter——必须为0或2,不能是1 - 防火墙不止要关
firewalld,iptables -L -n必须确认INPUT链没DROP目标为169.254.0.0/16或UDP端口12345–12350的包
misscount与disktimeout的配合陷阱:时间窗口竞争而非独立参数
misscount和disktimeout不是两个并行开关,而是一个串行判断链:节点先因网络心跳超时(misscount)被标记为“疑似死亡”,再用磁盘心跳(disktimeout)决定谁活下来。但高负载下二者常同时失守:
-
crsctl get css misscount返回30秒,但实际业务高峰时ocssd.bin发包间隔可能已达28秒——只剩2秒容错,任何一次I/O抖动就触发驱逐 -
disktimeout默认200秒,看似宽松,但它只在仲裁启动后才启用;而仲裁一旦启动,Voting Disk I/O延迟若已升至180ms+,多次写票失败后CSSD会放弃等待,直接按旧投票记录自裁 - 两节点集群最危险:没有多数派,全靠
voting disk和节点号仲裁;此时若ocssd.bin自身延迟波动大,node2可能因“节点号大”被node1驱逐,哪怕它负载更低
真正难处理的,是那些不报错却持续恶化的信号:ocssd.log里clssnmWaitForAckstimeout开始零星出现、crsctl stat res -t | grep ora.cluster_interconnect.haip状态在ONLINE/OFFLINE间抖动、netstat -s中packet reassembles failed值每小时增长>100——这些不是故障结果,而是倒计时读秒。


















