在oracle的RAC环境中,我们可以通过DBA_HIST_IC_DEVICE_STATS试图
读取 AWR 历史网卡设备统计信息,
DBA_HIST_IC_DEVICE_STATS,用于
查看 Oracle RAC 实例内部网卡(Interconnect,私网)的历史流量增量,筛选指定网卡实例 1、IP 段的流量信息,计算两次 AWR 快照之间的收发流量差值(MB),用来排查 RAC 私网流量历史变化。
重点:
DBA_HIST_IC_DEVICE_STATS 只采集
RAC 节点间心跳 / 缓存融合(Cache Fusion)私网,
不是业务公网网卡流量,记录的是 RAC 内部节点之间传输数据的统计。
采集对象:RAC 节点之间所有流量(Cache Fusion + GES 锁消息 + 心跳包)
局限:是数据库读到的网卡统计,不是操作系统全量协议栈统计;AWR 快照粒度(默认 1h);实例重启 / 网卡重置,bytes 计数器清零。 对比:DBA_HIST_SYSSTAT 里 gc cr/current bytes, 只统计数据块,不含锁、心跳小包。
不能解决:
- 无法区分流量是 Cache Fusion 还是 GES 锁消息(只能看到总流量)
- 无法直接定位是哪条 SQL 产生流量(需要搭配 ASH)
没有秒级数据,只能看快照区间粗粒度
客户 2 节点 RAC,上午 10 点开始业务响应变慢,AWR 报告看到大量
gc cr block receive wait,怀疑私网带宽瓶颈。
疑问:到底是 网卡带宽打满,还是 少量块传输但延迟高(网卡丢包 / 网卡降速)?
执行修复后的 SQL,画出 10 点前后私网流量:
结论: 不是流量大,是私网链路质量问题。 后续 OS 层面排查:网卡存在 CRC 错误、交换机端口偶发丢包,导致块传输等待。
如果流量飙升到接近网卡上限,则判断是带宽瓶颈,需要拆分私网、升级网卡。
对比验证:DBA_HIST_SYSSTAT 查看 gc cr bytes,发现 Cache Fusion 块流量并没有暴涨,说明等待不是大量数据块,而是锁消息 / 网络抖动。
新业务上线,RAC 节点 2 的 CPU 飙升,AWR 发现 gc 相关等待持续上涨。运维怀疑业务大量跨节点访问。
DIFF_RECEIVED_MB / DIFF_SENT_MBgc cr bytes同步暴涨,确认是 Cache Fusion 块传输。根因:业务连接随机分配,数据全部在节点 1,所有查询在节点 2 发起,大量 CR 块跨节点传输。
解决方案:业务会话绑定服务,读写路由到数据所在节点;或者做分区,打散数据到两个节点。
验证:调整业务后,再次查询 DBA_HIST_IC_DEVICE_STATS,私网流量回落至 250MB/h,gc 等待消失。
RAC 配置两块私网网卡(ens4f0np0、ens4f0np1),做网卡绑定,运维怀疑流量只跑在其中一块网卡。
分别按 if_name 分组,查看两块网卡的历史收发增量:
ens4f0np1:每小时几十 MB,几乎没有流量
结论:网卡绑定策略异常,流量只走单网卡,另外一块闲置。
解决:调整 bond 模式,重新配置 RAC 互联网卡;验证后两块网卡负载均衡。
注意:DBA_HIST_CLUSTER_INTERCON 配合此视图,确认数据库当前识别的互联网卡。
银行 RAC,准备大促压测,需要评估私网容量基线,预判瓶颈。
预估大促业务量提升 3 倍 → 预估流量 12GB/h,换算带宽≈33MB/s,远低于万兆网卡上限。
结论:私网带宽足够,风险不在带宽,需要重点关注 gc 等待、节点间块争用。
如果预估流量接近网卡上限,则需要提前准备 RDMA/25G 网卡扩容。
查询 DBA_HIST_IC_DEVICE_STATS 计算 DIFF_RECEIVED_MB,发现某一条记录是巨大负数,运维误以为网卡流量异常。
原理:节点重启,网卡的
bytes_received计数器重置为 0。下一次快照采集时,新值 < 旧值,差值为负。
处理:SQL 增加 case 判断,负数直接过滤,排除重启断点干扰。
CASE WHEN (next_bytes_received - bytes_received) >0 THEN round((next_bytes_received - bytes_received)/1024/1024,2) ELSE 0 END DIFF_RECEIVED_MB
案例中使用的生产sql
SELECT a.snap_id, a.instance_number, a.if_name, a.ip_addr, a.bytes_received, a.bytes_sent, a.next_bytes_received, a.next_bytes_sent, -- 计算接收增量,负数置0(节点重启计数器清零场景) CASE WHEN (a.next_bytes_received - a.bytes_received) > 0 THEN ROUND((a.next_bytes_received - a.bytes_received) / 1024 / 1024, 2) ELSE 0 END AS diff_received_mb, -- 计算发送增量,负数置0 CASE WHEN (a.next_bytes_sent - a.bytes_sent) > 0 THEN ROUND((a.next_bytes_sent - a.bytes_sent) / 1024 / 1024, 2) ELSE 0 END AS diff_sent_mb, -- 快照时间,关联AWR快照表拿到真实时间 s.end_interval_time snap_end_time FROM ( SELECT t.snap_id, t.instance_number, t.if_name, t.ip_addr, t.bytes_received, t.bytes_sent, LEAD(t.bytes_received) OVER ( PARTITION BY t.instance_number, t.if_name, t.ip_addr ORDER BY t.snap_id ) AS next_bytes_received, LEAD(t.bytes_sent) OVER ( PARTITION BY t.instance_number, t.if_name, t.ip_addr ORDER BY t.snap_id ) AS next_bytes_sent FROM SYS.DBA_HIST_IC_DEVICE_STATS t ) a -- 关联快照时间 LEFT JOIN DBA_HIST_SNAPSHOT s ON a.snap_id = s.snap_id AND a.instance_number = s.instance_number -- 关联互联网卡配置,验证网卡有效性 LEFT JOIN DBA_HIST_CLUSTER_INTERCON ci ON a.snap_id = ci.snap_id AND a.instance_number = ci.instance_number AND a.if_name = ci.name WHERE a.instance_number = 1 -- 指定RAC实例 AND a.if_name = 'ens4f0np0' -- 指定私网网卡 AND a.ip_addr LIKE '192.168.40%' -- 私网IP段过滤 ORDER BY a.snap_id;
用来对比「网卡总流量」vs「数据库 Cache Fusion 块流量」,配套一起分析:
SELECT
snap_id,
instance_number,
stat_name,
value,
ROUND((next_val - value)/1024/1024,2) diff_mb
FROM (
SELECT
snap_id,
instance_number,
stat_name,
value,
LEAD(value) OVER(PARTITION BY instance_number,stat_name ORDER BY snap_id) next_val
FROM DBA_HIST_SYSSTAT
WHERE stat_name IN ('gc cr bytes received','gc cr bytes sent','gc current bytes received','gc current bytes sent')
)
WHERE (next_val - value) > 0
AND instance_number =1
ORDER BY snap_id,stat_name;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12798004/viewspace-3183642/ ,如需转载,请注明出处,否则将追究法律责任。