ITPub博客

首页 > 数据库 > Oracle > RAC性能分析 - gc buffer busy acquire 等待事件

RAC性能分析 - gc buffer busy acquire 等待事件

原创 Oracle 作者:DBA_每日记 时间:2019-11-13 14:43:22 0 删除 编辑

问题背景:

客户反馈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)


 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69950231/viewspace-2663898/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-10-09

  • 博文量
    68
  • 访问量
    27929