rcvbuferrors每秒增长>0即锁定为内核udp接收缓冲区溢出,需将net.core.rmem_max设为≥24mb并重启oracle实例生效。

看rcvbuferrors是不是真瓶颈
看到gc cr block lost或gc current block lost等待上升,第一反应不该调_gc_affinity_time或gc_files_to_locks,而是立刻跑:netstat -su | grep "rcvbuferrors"
如果这个值每秒增长 > 0,基本锁定为内核 UDP 接收缓冲区溢出。RAC 的 GCS/GES 流量走 UDP,丢包后 Oracle 不重传,只靠上层重试兜底——结果就是延迟飙升、块丢失。
默认net.core.rmem_max通常只有 212992(约 208KB),远不够。必须设为 ≥ 24MB:sysctl -w net.core.rmem_max=25165824
并写入/etc/sysctl.conf持久化。关键点:LMS 进程只在启动时读该值,改完不重启 Oracle 实例,等于没改。
验证是否生效:cat /proc/sys/net/core/rmem_max输出必须是25165824
别和net.core.rmem_default混淆——Oracle 只认rmem_max。
确认私网 MTU 是否端到端一致且真生效
MTU=1500 时,64K GC 块必然分片;而packet reassembles failed持续上涨,就是分片重组失败的铁证——OSWatcher 日志里这个指标一涨,说明已有节点在静默丢包。
三端必须全部设为 9000,漏一个就白配:
• Linux 节点:ip link set dev eth1 mtu 9000(临时),或写进/etc/sysconfig/network-scripts/ifcfg-eth1的MTU=9000
• 华为交换机:system jumboframe enable + interface GigabitEthernet X/X/X; jumboframe enable
• Cisco:system mtu routing 9000 + interface TenGigabitEthernet X/X; mtu 9000
但设了不等于生效。必须:
• 运行ethtool eth1确认Supports jumbo frames: Yes
• 用ping -M do -s 8972 -I eth1 remote_node_ip测试(8972 = 9000 − ICMP/IP 头)
• 停集群再统一配置:crsctl stop crs,改完重启,别信“滚动生效”
区分网络抖动和 SQL 设计问题
gc cr block busy等待时间长,不等于网络慢。先查GV$SYSTEM_EVENT中该事件的分桶分布:
• 如果集中在1ms或4ms桶 → 锁争用或未绑定变量的循环 SQL
• 如果突增于16ms桶 → 才是网络抖动、中断延迟或交换机 CPU 过载
再结合GV$SQL找真凶:
• buffer_gets/executions高但disk_reads/executions低的语句,大概率是 GC 密集型 SQL
• 开ALTER SYSTEM SET EVENTS '10046 trace name context forever, level 8'抓 trace,看WAIT #1: nam='gc current block 2-way'后面紧跟着的是什么 SQL
这类 SQL 在单实例飞快,在 RAC 上却触发海量 GC 请求——比如未绑定变量的批量 INSERT、全表扫描 JOIN、或 PARALLEL UPDATE。
验证 Interconnect 实际吞吐与丢包
别信ifconfig显示的“利用率才 30%”。它统计的是 L2 层字节数(含以太网头 + CRC),比 Oracle GC 载荷多 40–60 字节/包,直接除理论带宽会高估 15%–20%。
真实测法:
• 测 UDP 吞吐(更关键):netperf -H <peer-ip> -t UDP_STREAM -l 60</peer-ip>
万兆私网稳定值应 ≥ 9 Gbps;低于 7 Gbps 就要查交换机背板、驱动或中断合并
• 看ethtool -S eth2里的rx_discards和tx_aborted_errors:非零值基本指向网卡驱动缺陷或交换机 QoS 限速
• 查netstat -s | grep -i "retransmit\|error\|drop",内核层丢包比 Oracle 统计早暴露问题
另外,GV$CLUSTER_INTERCONNECTS只告诉你用了哪张网卡,不反映实际负载;真正要看的是流量是否集中在某两个节点之间(用iftop -P tcp -f "port 6200 or port 6201"确认)。











