问题背景:
客户反馈cpu负载较高,协助查看原因
1> awr报告
概述
---------------------
gc buffer busy是RAC数据库中常见的等待事件,11g开始gc buffer busy分为gc buffer busy acquire和gc buffer busyrelease。
gc buffer busy acquire是当session#1尝试请求访问远程实例(remote instance)buffer,但是在session#1之前已经有相同实例上另外一个session#2请求访问了相同的buffer,并且没有完成,那么session#1等待gc buffer busy acquire。
gc buffer busy release是在session#1之前已经有远程实例的session#2请求访问了相同的buffer,并且没有完成,那么session#1等待gc buffer busy release。
以最简单的双节点RAC为例,当实例1发起一条select查询某个block的时候,如果这个block不在本地的Buffer cache,但是能在实例2的buffer cache里找到,那么实例1的LMS进程会通过私网将这个block从实例2的cache获取到实例1的cache,以避免physical reads,获取过程中会出现gc cr block 2-way相关的等待事件,这就是cache fusion的基本功能,之后如果这个block没有被任何一个实例更改,那么实例1与实例2访问这个block就只需从本地的buffer cache读取(假设buffer cache足够大,block未被flush出buffer cache),本地读取的情况下不会发生与gc相关的等待事件,对于同一个block只需跨节点传输一次,这是一种比较理想的情况。跨节点读取除了这种以读为主的情况外,还常见于以下场景:
实例1和实例2的buffer cache都含有这个block,T1时刻实例1修改了这个block,T2时刻实例2的会话读取这个block时就会从实例1的buffer cache里读过来,过程中实例2会话统计里就会观察到gc cr block busy相关的等待事件。
—gc buffer busy acquire
沿用上面例子:实例1和实例2的buffer cache都含有某个block,T1时刻实例1修改了这个block,T2时刻实例2上的会话1读取这个block,当这个读取还没有完成,实例2上的会话2也发起了读取相同block的操作,这时会话2就会等在gc buffer busy acquire上。实例2同时发起的读取相同block的会话数越多,我们就越容易观察到gc buffer busy acquire等待。
—gc cr block busy
仍沿用上面例子:实例1和实例2的buffer cache都含有某个block,T1时刻实例1修改了这个block;T2时刻实例2上的会话1读取这个block修改前的CR copy,因为CR copy需要通过应用undo record才能构造出来,且构造的过程中必须将改变记入到实例1的online redo,因此实例2会话1读取的时候在可能会因为如下原因而发生gc cr block busy等待:
原因
---------------------
- 热点块(hot block)
在AWR中Segments by Global CacheBuffer Busy 记录了访问频繁的gc buffer.
解决方法可以根据热点块的类型采取不同的解决方法,比如采取分区表,分区索引,反向index等等。这点与单机数据库中的buffer busy waits类似。
- 低效SQL语句
低效SQL语句会导致不必要的buffer被请求访问,增加了buffer busy的机会。在AWR中可以找到TOP SQL。解决方法可以优化SQL语句减少buffer访问。这点与单机数据库中的buffer busy waits类似。
- 数据交叉访问。
RAC数据库,同一数据在不同数据库实例上被请求访问。
如果应用程序可以实现,那么我们建议不同的应用功能/模块数据分布在不同的数据库实例上被访问,避免同一数据被多个实例交叉访问,可以减少buffer的争用,避免gc等待。
- Oracle bug
- 解决方法:
安装Patch 13787307 或者 设置_gc_bypass_readers=false临时规避这个问题。
另外,在11.2低版本中也有些类似的已知问题,建议安装最新patch set (11.2.0.3/4)+ 最新PSU 。
Patch set和PSU信息请参考:Oracle RecommendedPatches -- Oracle Database (Doc ID 756671.1)
alter system set "_gc_bypass_readers=false"=false sid='*';
rac节点可以不停服务重启