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

概述
---------------------
gc buffer busy是RAC数据库中常见的等待事件,11g开始gc buffer  busy分为gc buffer busy acquire和gc buffer  busy release。

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尝试请求访问本地实例buffer时,发现之前已经有远程实例的session#2请求访问该buffer,并且没有完成,那么session#1等待gc buffer busy release。

原因/解决方法
---------------------
- 热点块(hot block)
在AWR中Segments by Global Cache Buffer 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
建议安装Oracle推荐的最新Patch Set和PSU。
Patch set和PSU信息请参考:Oracle Recommended Patches -- Oracle Database (Doc ID 756671.1)

案例分享
---------------------
一个gc buffer busy acquire的案例,和大家分享一下。

- 应用端反映业务处理异常,数据库hang,在第一时间现场DBA收集了hanganalyze (hanganalyze对于分析数据库hang非常重要)

RAC数据库收集hanganalyze的命令:
SQL> conn / as sysdba
SQL> oradebug setmypid
SQL> oradebug unlimit
SQL> oradebug -g all hanganalyze 3

通过hanganalyze我们可以比较容易看到有1000个以上的Chain都有类似的等待关系,比如:

Chain 1 Signature: ‘gc current request‘<=‘gc buffer busy acquire‘<=‘enq: TX -  contention‘
Chain 2 Signature: ‘gc current request‘<=‘gc buffer busy  acquire‘<=‘buffer busy waits‘

Chain 1243 Signature: ‘gc current request‘<=‘gc buffer busy  acquire‘<=‘enq: TA - contention‘
Chain 1244 Signature: ‘gc current request‘<=‘gc buffer busy  acquire‘<=‘enq: TA - contention‘

Hanganalyze说明数据库中大部分session直接或者间接等待‘gc  current request‘<=‘gc buffer busy acquire‘。

- 有些情况下dia0 trace文件也会记录hang信息

inst# SessId  Ser#     OSPID PrcNm Event

----- ------ ----- --------- ----- -----

1   1152     3  21364904    FG gc buffer busy acquire

1   2481     3  26607642    FG gc current request

Chain 1 Signature: ‘gc current request‘<=‘gc buffer busy acquire‘

Chain 1 Signature Hash: 0x8823aa2a

- 有些情况下dba_hist_active_sess_history也会记录hang信息。

1. 在数据库hang的时间段内,有691个session在等待‘enq: TA - contention‘,‘enq: TA - contention‘的持有者是session#931,serial#39657


2. session#931,serial#39657  也是处于等待状态,等待事件是‘gc buffer busy acquire‘,而‘gc buffer busy
acquire‘的持有者是session#1324,serial#22503


3. session#1324,serial#22503  也是处于等待状态,等待事件是‘gc current request‘

通过分析dba_hist_active_sess_history,也可以得到session等待关系:
‘gc current request‘<=‘gc buffer busy  acquire‘<=‘enq: TA - contention‘
这个等待关系与hanganalyze是一致的。

- 根据以上分析得到session等待关系,可以确定数据库hang的原因是oracle已知问题Bug
13787307 - Hang in RAC with ‘gc current request‘<=‘gc buffer busy acquire‘  signature.

- 解决方法:
安装Patch 13787307 或者 设置_gc_bypass_readers=false临时规避这个问题。
另外,在11.2低版本中也有些类似的已知问题,建议安装最新patch set (11.2.0.3/4) + 最新PSU 。
Patch set和PSU信息请参考:Oracle Recommended Patches -- Oracle Database (Doc ID 756671.1)

参与此主题的后续讨论,请回复blog,或者访问我们的中文社区,跟帖"共享:RAC等待事件:gc buffer busy acquire"。

原文地址:https://www.cnblogs.com/DataArt/p/10018973.html

时间: 2024-10-14 08:05:34

RAC性能分析 - gc buffer busy acquire 等待事件的相关文章

[RAC性能调优] gc buffer busy acquire 处理

 RAC性能调优] gc buffer busy acquire 处理          分类: troubleshooting RAC 2014-04-21 20:02 255人阅读 评论(0) 收藏 编辑 删除 目录(?)[+] RAC性能调优 gc buffer busy acquire 处理  [RAC性能调优] gc buffer busy acquire 处理 event 解释: gc buffer busy acquire是当session#1尝试请求访问远程实例(remo

gc buffer busy acquire和gc buffer busy release原理及案例

昨天正式环境上出现数据库CPU 100%的问题,数据库是128个CPU,128G内存,power系列,非常强劲,十几万的逻辑读只需要1s.出现问题之后,调整两条负载最高的两条SQL,问题解决,但有两个cluster类别的等待事件第 一次见,在metlink中找了一篇文章: 共享:RAC等待事件:gc buffer busy acquire 概述 --------------------- gc buffer busy是RAC数据库中常见的等待事件,11g开始gc buffer  busy分为gc

RAC 性能分析 - &#39;log file sync&#39; 等待事件

简介 本文主要讨论 RAC 数据库中的'log file sync' 等待事件.RAC 数据库中的'log file sync' 等待事件要比单机数据库中的'log file sync' 等待事件复杂,主要原因是由于RAC 数据库需要将SCN同步到所有实例. 首先,回顾一下单机数据库中的'log file sync' 等待事件,当user session 提交(commit)时,user session会通知LGWR进程将redo buffer中的信息写入到redo log file,当LGWR

常见的global cache等待事件

gc cr disk read事件 当node 1需要读取的block在node 2的buffer cache里,且block中包含尚未提交的事务,那么node 2的LMS进程需要使用undo record将该block回滚至node 1发起那一时刻的内容后再传给node 1,假如这时undo record所在的undo block不在node 2的buffer cache里,node 1上就会出现gc cr disk read事件,表示node 1正等待node 2的LMS授予其直接从磁盘读取

Oracle RAC 全局等待事件 gc current block busy 和 gc cr multi block request 说明--转载(http://blog.csdn.net/tianlesoftware/article/details/7777511)

一.RAC 全局等待事件说明 在RAC环境中,和全局调整缓存相关的最常见的等待事件是global cache cr request,global cache busy和equeue. 当一个进程访问需要一个或者多个块时,Oracle会首先检查自己的Cache是否存在该块,如果发现没有,就会先通过global cache赋予这些块共享访问的权限,然后再访问.假如,通过global cache发现这些块已经在另一个实例的Cache里面,那么这些块就会通过Cache Fusion,在节点之间直接传递,

Oracle 等待事件之 buffer busy waits

buffer busy waits (热块儿争用) 官网解释: This wait indicates that there are some buffers in the buffer cache that multiple processes are attempting to access concurrently. Query V$WAITSTAT for the wait statistics for each class of buffer. Common buffer classe

通过案例学调优之--模拟buffer busy waits事件

通过案例学调优之--模拟buffer busy waits事件 buffer busy waits等待事件     Wait occurs when a session attempts to access a block in memory, is denied and must wait until the buffer becomes available. This event happens because a buffer is either being read into the b

buffer cache —— buffer busy waits/read by other session

oracle提供非常精确.有效的row level lock机制,多个用户同时修改数据时,为了保护数据,以块为单位挂起锁的情况不会发生.但这不太正确.以块为单位的锁虽然不存在,但正因为oracle I/O以块为单位组成,所以块单位锁是必要的.假设row1.row2两个行位于同一个块内,两名用户(用户1.用户2)各自对row1.row2执行update,逻辑上两个被更新行之间不存在需要相互保护的数据.因为oracle提供row level lock机制,所以修改互相不用的行完全不成问题.但是若两个

Oracle 常见的33个等待事件

一. 等待事件的相关知识: 1.1 等待事件主要可以分为两类,即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件. 1). 空闲等待事件指Oracle正等待某种工作,在诊断和优化数据库的时候,不用过多注意这部分事件. 2). 非空闲等待事件专门针对ORACLE的活动,指数据库任务或应用运行过程中发生的等待,这些等待事件是在调整数据库的时候需要关注与研究的. 在Oracle 10g中的等待事件有872个,11g中等待事件1116个. 我们可以通过v$event_name 视图来查看等待