如何通过Oracle AWR诊断RAC集群心跳延迟 在Oracle RAC的运维排查中,有一种情况相当典型:数据库性能突然变慢,AWR报告里赫然出现了gc cr block lost或gc current block lost。这时候,基本可以断定集群的心跳网络已经出现了延迟。需要明确的是,单纯观察
在Oracle RAC的运维排查中,有一种情况相当典型:数据库性能突然变慢,AWR报告里赫然出现了gc cr block lost或gc current block lost。这时候,基本可以断定集群的心跳网络已经出现了延迟。需要明确的是,单纯观察到全局缓存(GC)等待时间变长或者SQL执行变慢,并不直接等同于心跳问题。真正的诊断起点,应该是先确认私网通信这个底层通道是否健康。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
打开AWR报告,重点应该盯住两个部分——既不是Top SQL,也不是Instance Efficiency,而是RAC Statistics和Global Cache Stats。这里的几个关键指标,是判断私网状况的“体温计”:
A vg global cache block receive time (ms):这个平均接收时间是黄金指标。正常情况下应该是个位数(毫秒)。一旦这个值持续超过10ms,基本就坐实了私网存在严重延迟。Estd Interconnect traffic (KB):估算的互联流量。通常每秒几百KB是合理范围。如果这个值突然飙升到几MB/s(例如24 MB/s),那就意味着Cache Fusion流量暴增。这往往不是好事,通常由MTU设置过小、网络丢包或者带宽不足引发的重传堆积所导致。Global Cache Load Profile中的Blocks served(服务块数)和Blocks received(接收块数)的比值。如果某个节点的接收块数远大于服务块数,说明这个节点正在被动地大量“拉取”数据块,很可能已经成为集群的性能瓶颈点。当然,并非所有的GC等待事件都意味着心跳网络坏了。但下面这几个家伙如果频繁出现,并且平均等待时间很长,那么十有八九可以归咎于私网延迟或丢包:
gc cr block lost 和 gc current block lost:这是最典型的信号。注意,这里的“lost”并不是数据块真的丢了,而是请求发出去后,在规定时间内没收到对端的响应,只能超时重发。其底层根源往往是IPC Send timeout或者TCP重传失败。gc buffer busy acquire/release:当某个数据块在传输途中被卡住,后续需要访问这个块的进程就会排队等待,从而引发“buffer busy”等待。这本质上是传输延迟所触发的一系列连锁反应。gc freelist block busy:这个事件相对少见,但如果它集中间出现在某个特定节点,就需要警惕了。这可能意味着该节点的收包队列已经积压,ksxp消息队列已满。此时,A vg message sent queue time on ksxp (ms)这个指标通常会同步飙升。这里有个重要的区分点:像gc cr block 2-way或gc current block 2-way这类带有“2-way”字样的等待事件,属于RAC正常运作下的合理开销,不能直接当作故障指标来看待。
AWR报告展示的更多是“结果”,要找到“真凶”,还得深入操作系统层面去寻找线索。别只满足于ethtool显示“Link detected”,下面这些操作系统的信号更为关键:
netstat -s | grep -i “reasm\|frag\|drop”。重点观察IpReasmFails(IP分片重组失败)的计数是否在持续增长。如果答案是肯定的,那么99%的可能性是MTU不匹配造成的(例如,一端设置了9000的巨帧,而交换机或对端服务器仍使用标准的1500)。ping -c 2 -M do -s node2-priv 命令进行巨帧测试。建议从-s 8972开始尝试,每次增加1字节,直到出现Frag needed and DF set (mtu = X)的提示,这就找到了路径上的MTU上限。/var/log/oracle/crsd/ocssd.log,搜索IPC Send timeout detected或包含misscount的WARNING信息。一旦出现“75% of misscount”这类警告,就必须立即干预,千万不要等到100%。crsctl get css misscount和crsctl get css disktimeout来获取当前配置值。不要相信安装文档上的默认值,系统在打补丁或升级后,这些参数很可能已经被覆盖。面对心跳延迟,试图单纯调大misscount参数是饮鸩止渴,它只会让节点驱逐发生得更晚,但问题爆发时会更加剧烈。真正的瓶颈,往往隐藏在软件与硬件的交界地带:
ksxp收包线程很可能因抢不到CPU资源而被“饿死”,直接导致A vg message sent queue time飙升到几十毫秒。最后,一个至关重要的提醒:当gc类等待事件飙升时,先别急着去调整_gc_policy_time或gc_files_to_locks这类数据库参数。这些手段多数时候只是治标。根据大量的实战经验,超过80%的类似案例表明,修复私网连通性和性能问题,比修改任何数据库参数都更直接、更有效。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述