直接看ocssd.log和gipc.log可确认延迟已导致心跳超时、CSSD重连及CRS-7500报错;GIPC依赖UDP多播,需抓包验证是否加入多播组、MTU是否一致、IP分片是否失败,并提升gipcd.log日志级别至4以定位连接耗时与超时根源。

直接看 ocssd.log 和 gipc.log,延迟不是“可能有”,而是已经体现在节点间心跳超时、CSSD反复重连、CRS-7500 报错里了。GIPC 不是黑盒,它依赖底层网络和内核参数,排查必须从协议栈往下打。
确认 GIPC 是否真在用 UDP 且已启用多播
GIPC 默认走 UDP 多播(不是 TCP),但若私网不支持多播或被防火墙拦截,会退化为单播甚至降级失败。检查不能只信配置,得抓包验证:
- 查
gipcd.log开头是否有GIPC_PROTOCOL=udp和GIPC_MULTICAST=on;没有就说明被强制关闭了 - 运行
netstat -g | grep gipc,确认节点是否加入了 GIPC 多播组(通常是224.0.0.255或类似) - 在私网接口上抓包:
tcpdump -i bond1 host 224.0.0.255 -nn -w gipc.pcap,看有没有持续的 GIPC 多播包进出 - 若
tcpdump没流量,但ocssd.log显示 “GIPC failed to identify the Fast Node Death Detection”,基本就是多播不通
检查 MTU 和 IP 分片是否导致 packet reassembles failed
Oracle RAC 私网通信对 MTU 敏感,一旦两端 MTU 不一致(比如一端 1500,另一端 9000),就会触发 IP 分片 —— 而 Linux 内核的 packet reassembles failed 计数上涨,正是 GIPC 包重组失败的直接证据:
- 在所有节点执行:
ip link show bond1 | grep mtu(把bond1换成你实际的私网接口名) - 比对所有节点输出,MTU 必须完全一致;不一致立刻统一改掉,不要试图“兼容”
- 查失败计数:
netstat -s | grep -A5 "IP:" | grep "reassembles failed",重启前记下数值,观察是否随 CSSD 启动而飙升 - 如果数值增长快,且私网交换机未开启 jumbo frame,建议将 MTU 统一设为
1500,而非盲目调大
验证 GIPC 日志级别是否足够定位延迟源
gipcd.log 默认日志级别太低,看不到具体连接耗时和重传行为。不改日志级别,等于蒙眼修车:
- 临时提升:在
$GRID_HOME/log/下找到当前/gipcd/ gipcd.log,加一句:export GIPC_LOG_LEVEL=4,然后crsctl stop crs && crsctl start crs - 关键线索藏在日志里:
GIPC[xxx] gipcInternalConnect: connect timeout after、ms GIPC[xxx] gipcInternalSend: send failed, errno=111(连接拒绝)、gipcInternalRecv: recv timeout - 注意时间戳对齐:把
gipcd.log和ocssd.log的时间戳(精确到毫秒)对照看,确认是 GIPC 先挂,还是 CSSD 主动放弃它 - 别依赖
crsctl check crs—— 它返回 “online” 只代表进程活着,不代表 GIPC 通道可用
真正卡住 GIPC 的,往往不是 Oracle 配置,而是交换机 ACL、网卡驱动 bug、内核 net.ipv4.ipfrag_time 设置过短,或者私网用了混杂模式却没关掉 IGMP snooping。这些点不逐个排除,光调 GIPC_HEARTBEAT_INTERVAL 就是往错误方向使劲。











