Oracle RAC集群的稳定性很大程度上取决于私网(Private Network,也就是interconnect)的质量,而带宽规划又是其中最容易踩坑的环节。私网带宽给小了,节点间的全局缓存传输会丢包、重传,引发gc block lost等待甚至节点驱逐;给大了又可能造成投入浪费。这篇文章就来系统地聊聊interconnect带宽的估算方法、常见故障表现以及组网选型建议。

一、interconnect上到底跑了什么流量
要规划带宽,首先得理解私网流量从哪里来。RAC的多节点共享存储架构下,每个节点都有自己的SGA,同一个数据块可能同时被多个节点以不同模式持有。为了保持一致性,Oracle引入了Cache Fusion机制:当节点A需要访问一个被节点B持有的块时,并不会直接从磁盘读取,而是通过私网让节点B把这个块的主拷贝或者共享拷贝传输过来。
所以私网上跑的核心流量就是块镜像消息(BCM)和块本身。此外还有GCS(全局缓存服务)和GES(全局队列服务)的元数据消息、心跳流量,以及11g之后可能出现的结果集缓存相关的消息。这些流量的大小完全取决于业务模式:如果是OLTP系统,节点间频繁交换小块,单次传输量不大但频率很高;如果是批处理或者大表全扫描被并行拆分到多个节点,动辄就是大量的块批量传输,瞬时压力会非常大。
一个容易被低估的场景是应用连接没有做亲和性设计。比如同一个业务模块的请求被负载均衡随机分发到所有节点,同一个热点块在不同节点间被来回请求,私网流量会被放大好几倍。这也是为什么DBA常说,RAC性能问题的第一排查方向往往就是私网。
二、带宽怎么估算:从GC流量到网卡规格
带宽估算的基本思路是:先测出单节点间私网流量峰值,再乘以合理的安全系数。可以用下面这个查询从AWR或者AWRSQRPT里大致估算块传输量:
-- 查询全局缓存传输统计(基于GV$SYSSTAT)
SELECT inst_id, name, value
FROM gv$sysstat
WHERE name IN ('gc cr blocks received',
'gc current blocks received',
'gc cr blocks served',
'gc current blocks served');
-- 粗略估算私网吞吐:块数 x 8KB / 统计间隔秒数
-- 例如:10分钟内 gc cr blocks received = 7500000
-- 吞吐 = 7500000 * 8 * 1024 / 600 ≈ 100 MB/s ≈ 0.8 Gbps得到基础吞吐之后,建议再乘以3到5倍的安全系数。为什么要留这么大余量?一是AWR统计的是平均值,而私网流量往往呈脉冲式分布,某个批量任务启动的几秒内流量可能是均值的十倍;二是UDP协议本身有重传开销,丢包后重传会让实际流量雪崩式增长;三是要预留业务增长的空间。
从经验值来看,两节点的中小型OLTP系统,节点间GC流量通常在几十MB/s以内,千兆网勉强能跑但风险较高,万兆是起步配置;四节点以上的集群,或者存在跨节点并行查询、大事务的系统,万兆是标配,高负载场景建议考虑25G或者InfiniBand。另外要注意交换机的背板带宽和端口缓存,私网必须使用独立的专用交换机,和公网、存储网物理隔离,并且交换机要关闭流量控制相关的不当配置。
三、带宽不足的典型症状与排查手段
私网带宽或者质量出问题时,数据库会给出相当明确的信号。最常见的等待事件包括gc block lost、gc loss recovery、gc cr block busy以及gc buffer busy。其中gc block lost几乎就是私网丢包的代名词——Oracle通过UDP传输块,发送方发出后没有收到确认就认为块丢失,正常系统里这个值应该接近零,如果每分钟出现几十上百次,基本可以断定私网有问题。
排查时可以按这个顺序来:先看AWR报告中Global Cache Load Profile部分的gc blocks received/s和gc blocks transferred/s,确认流量水平;再看Top 10 Events里gc类等待的占比;然后用操作系统层面的工具验证网络质量,Linux下可以用netstat -su观察UDP的RcvbufErrors和SndbufErrors是否持续增长,这两个计数器是私网健康度的直观指标。
# 观察UDP收发缓冲区溢出情况,持续增长说明私网丢包 netstat -su | grep -i -E "buffer|overflow" # 用oratop或集群OSWatcher的oswnet统计私网网卡流量 cat /proc/net/dev | grep -E "eth1|bond0" # 私网ping延迟测试,正常应小于1ms且无丢包 ping -c 10000 -s 8972 -f 192.168.2.2
丢包的原因不一定是带宽不足,也可能是网卡队列、交换机端口协商速率不对、UDP缓冲区太小等。Linux下建议调大UDP缓冲区,例如net.core.rmem_max=4194304、net.core.wmem_max=4194304,这在Oracle的安装前检查脚本里也有明确要求。如果确认是带宽打满,就需要考虑升级网络或者在应用层做连接亲和,把相关业务固定到同一节点,从源头减少跨节点传输。
四、组网方案选择与容量预留建议
目前主流的私网组网方案有三种:千兆以太网基本已被淘汰,不建议新系统采用;万兆以太网(10GbE)是目前绝大多数OLTP环境的标准配置,性价比高,运维门槛低;InfiniBand(比如Exadata上用的方案)适合超大规模集群和数据仓库类的高吞吐场景,单条链路可达56Gbps以上,配合RDS协议传输效率比UDP over Ethernet更高。
无论选哪种方案,都建议做链路冗余。常见的做法是在操作系统层做bonding(mode 4动态链路聚合或mode 1主备),Oracle 19c也支持原生的HAIP,可以在一条私网上跑多个高可用IP实现负载分担。不过要注意HAIP最多支持4个地址,而且如果用了bonding,HAIP和bond模式的配合要提前测试,避免出现脑裂。
最后给一个实用的规划原则:私网带宽至少要是预估GC峰值流量的三倍,万兆起步;私网交换机独立部署、冗余配置;上线前用Swingbench或者真实业务回放做压力测试,观察gc block lost是否为零。带宽规划的钱在建设阶段花,远比上线后因为节点驱逐导致故障再补救便宜得多。
Oracle RACinterconnect私网带宽修改时间:2026-09-05 20:06:54