ITPub博客

首页 > 数据库 > Oracle > 第84期 查询RAC之间私网的流量信息,监控 RAC 私网流量变化

第84期 查询RAC之间私网的流量信息,监控 RAC 私网流量变化

原创 Oracle 作者:pxbibm 时间:2026-09-23 15:53:52 0 删除 编辑

在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, 只统计数据块,不含锁、心跳小包。

一、这个视图能解决的 5 大类问题

  1. RAC 私网流量历史趋势分析,定位流量突增时间段
  2. 区分:是业务增长导致流量上涨,还是异常 BUG / 低效 SQL 引发 Cache Fusion 风暴
  3. 多网卡 RAC:确认哪一块私网网卡承载流量、网卡是否负载不均
  4. 私网容量规划:评估带宽是否即将跑满,扩容评估
  5. 故障回溯:AWR 报告看到 gc 等待突增,核对同时间段私网流量是否同步上涨

不能解决:

  • 无法区分流量是 Cache Fusion 还是 GES 锁消息(只能看到总流量)
  • 无法直接定位是哪条 SQL 产生流量(需要搭配 ASH)
  • 没有秒级数据,只能看快照区间粗粒度


案例 1:RAC 巡检发现大量 gc cr block receive wait,排查私网是否拥塞

现象

客户 2 节点 RAC,上午 10 点开始业务响应变慢,AWR 报告看到大量 gc cr block receive wait,怀疑私网带宽瓶颈。

疑问:到底是 网卡带宽打满,还是 少量块传输但延迟高(网卡丢包 / 网卡降速)?

使用 DBA_HIST_IC_DEVICE_STATS 分析

执行修复后的 SQL,画出 10 点前后私网流量:

  • 9:00 快照:DIFF_SENT_MB ≈ 300MB/h
  • 10:00 快照:DIFF_SENT_MB ≈ 320MB/h 私网是万兆网卡(理论上限约 1100MB/s), 每小时几百 MB,带宽占用极低。

结论: 不是流量大,是私网链路质量问题。 后续 OS 层面排查:网卡存在 CRC 错误、交换机端口偶发丢包,导致块传输等待。

如果流量飙升到接近网卡上限,则判断是带宽瓶颈,需要拆分私网、升级网卡。

对比验证:DBA_HIST_SYSSTAT 查看 gc cr bytes,发现 Cache Fusion 块流量并没有暴涨,说明等待不是大量数据块,而是锁消息 / 网络抖动。

案例 2:业务上线后 RAC 私网流量突增,定位跨实例数据访问问题

现象

新业务上线,RAC 节点 2 的 CPU 飙升,AWR 发现 gc 相关等待持续上涨。运维怀疑业务大量跨节点访问。

使用 DBA_HIST_IC_DEVICE_STATS

  1. 查询视图,对比上线前后的 DIFF_RECEIVED_MB / DIFF_SENT_MB
  2. 上线前:每小时私网流量 200MB;上线后:每小时 2.8GB,暴涨 14 倍。
  3. 再关联 DBA_HIST_SYSSTAT: gc cr bytes同步暴涨,确认是 Cache Fusion 块传输。
  4. 关联 DBA_HIST_ASH,找到 top SQL:SQL 频繁访问节点 1 上的数据,业务连接全部跑到节点 2。

根因:业务连接随机分配,数据全部在节点 1,所有查询在节点 2 发起,大量 CR 块跨节点传输。 

解决方案:业务会话绑定服务,读写路由到数据所在节点;或者做分区,打散数据到两个节点。 

验证:调整业务后,再次查询 DBA_HIST_IC_DEVICE_STATS,私网流量回落至 250MB/h,gc 等待消失。

案例 3:RAC 多私网网卡,判断流量负载不均衡

现象

RAC 配置两块私网网卡(ens4f0np0、ens4f0np1),做网卡绑定,运维怀疑流量只跑在其中一块网卡。

使用 DBA_HIST_IC_DEVICE_STATS

分别按 if_name 分组,查看两块网卡的历史收发增量:

  • ens4f0np0:每小时 2GB
  • ens4f0np1:每小时几十 MB,几乎没有流量

 结论:网卡绑定策略异常,流量只走单网卡,另外一块闲置。 

解决:调整 bond 模式,重新配置 RAC 互联网卡;验证后两块网卡负载均衡。

注意:DBA_HIST_CLUSTER_INTERCON 配合此视图,确认数据库当前识别的互联网卡。

案例 4:容量规划,评估年底大促私网带宽是否足够

场景

银行 RAC,准备大促压测,需要评估私网容量基线,预判瓶颈。

  1. 采集业务高峰 DBA_HIST_IC_DEVICE_STATS 的历史流量,得到基线:高峰每小时 4GB
  2. 预估大促业务量提升 3 倍 → 预估流量 12GB/h,换算带宽≈33MB/s,远低于万兆网卡上限。

结论:私网带宽足够,风险不在带宽,需要重点关注 gc 等待、节点间块争用。

如果预估流量接近网卡上限,则需要提前准备 RDMA/25G 网卡扩容。

案例 5:误判场景:流量计数器归零导致异常负数,识别节点重启

现象

查询 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;

配套扩展 SQL:Cache Fusion 块流量对照(DBA_HIST_SYSSTAT)

用来对比「网卡总流量」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/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 没有了~
请登录后发表评论 登录
全部评论
【DBAplus社群】联合发起人。ACOUG核心成员,Oracle用户组年轻专家。熟悉Oracle的体系结构,擅长Oracle数据库架构规划、SQL优化、OWI方面性能的优化。曾服务于航天、航空、机车、大型制造行业数据库的维护以及系统开发工作,开发过基于Oracle数据库的大型ERP系统。
  • 博文量
    341
  • 访问量
    2469383