GIPC初始化失败的明确报错是ocssd.log中出现“GIPC error: gipcretConnectionFailed (29)”或“gipcmodCreate: failed to create module”等含gipc前缀的错误行。

查 ocssd.log 里 GIPC 初始化失败的明确报错
GIPC(Global IPC)是 Oracle 12c RAC 中底层通信协议栈的核心,负责节点间所有 IPC 消息投递。它启动失败不会直接报“GIPC error”,而是表现为 CSSD 进程卡在初始化阶段、crsctl check cluster 返回 SUCCESS 但资源全为 INTERMEDIATE,或 olsnodes -s 显示节点状态为空。关键证据藏在 $GRID_HOME/log/<hostname>/cssd/ocssd.log 里:
- 搜索
GIPC+init或gipcd,重点关注类似GIPC error: gipcretConnectionFailed (29)、gipcmodCreate: failed to create module的行 - 若出现
clsu_get_private_ip_addresses: no ip addresses found,说明 GIPC 根本没拿到私网地址——不是网络不通,而是 oifcfg 配置与ip addr show输出的 CIDR 不匹配 - 看到
gipcConfGetIf: failed to get interface for network,大概率是私网网卡名(如bond1)在/etc/hosts或 GPnP profile 里拼写不一致,或该网卡未 up
验证 GIPC 绑定的私网地址是否真实可达
GIPC 启动后会绑定私网 IP 和端口(默认 UDP 3075),但这个“绑定”可能成功,“通信”却失败。不能只信 netstat -unlp | grep :3075,得看实际收发:
- 在 node1 上执行
strace -p $(pgrep ocssd) -e trace=recvfrom,sendto -s 1024 -o /tmp/cssd_net.log,然后从 node2nc -u node1 3075 < /dev/zero发包;观察日志里是否有recvfrom调用返回数据,还是长时间阻塞或EAGAIN - 检查内核接收队列堆积:
cat /proc/net/udp | awk '$8 ~ /0x0000132B/ {print $7}'(0x0000132B是 3075 十六进制),若rx_queue值持续 >1000,说明 UDP 包进来但 GIPC 线程没及时取走——常见于 VMware 下 CPU 抢占或 e1000e 驱动处理慢 - 用
tcpdump -i bond1 -n udp port 3075 -w gipc.pcap抓包,过滤出ip.src == node2 && udp.dstport == 3075,确认包是否真发到了网卡,再对比strace日志判断是丢在驱动层还是用户态
区分 GIPC 错误和上层 KSR 广播阻塞
很多人把 reliable message 等待事件当成 GIPC 故障,其实不是一回事:GIPC 是传输层协议,KSR 是其上构建的可靠广播机制。GIPC 崩了,CSSD 直接起不来;GIPC 正常但 KSR 卡住,reliable message 就会飙升。
- 如果
ocssd.log里有大量missed heartbeat且时间戳密集(比如每秒一条),但strace显示recvfrom正常返回,说明 GIPC 收包没问题,问题在 KSR 消息分发或订阅者消费慢(比如Result Cache: Channel) - 若
gv$channel_waits中kxfp control signal channel排第一,说明 ASM 实例没响应 GIPC 控制信号——先查srvctl status asm和asmcmd lsdg,别一头扎进网络抓包 -
reliable message等待超时默认 3 秒,而 GIPC 层错误(如连接拒绝)通常在毫秒级就报错,日志里会带gipc前缀和具体错误码,不混淆这两层,排查才不会跑偏
检查防火墙和 SELinux 对 GIPC UDP 流量的实际拦截
firewalld 默认放行的是服务名(如 oracle-db),对 GIPC 使用的动态 UDP 端口(3075 及附近)完全无感。SELinux 则更隐蔽:即使 setsebool -P oracle_execmem 1 已设,ausearch -m avc -ts recent 仍可能扫出 avc: denied { read write } for pid=12345 comm="ocssd.bin" path="/dev/shm/ora_orcl_..."。
- 临时停 firewalld:
systemctl stop firewalld,再跑crsctl check cluster—— 若立刻变绿,说明规则没生效;别用--add-port=3075/udp,必须用--add-source=172.16.4.0/24按网段放行 - 查 SELinux 是否真放行:
sesearch -A -s oracle_t -t shm_file_t -c file -p read,若无输出,说明共享内存访问被拦,需补semanage fcontext -a -t shm_file_t "/dev/shm/ora_.*"并restorecon - 确认内核参数:
/proc/sys/net/core/rmem_default和wmem_default至少设为 262144,过小会导致 GIPC UDP 包在内核层就被丢弃,netstat -su里会出现UdpInOverflows


















