RAC性能分析 – gc buffer busy acquire 等待事件 (Oracle官方博客 – 数据库产品技术支持)_1

2025-06-26Oracle / RAC / 性能优化

By Jian Zhang-Oracle on 一月 20, 2014

概述

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'

1756814939084-453c38ea-79f8-44de-bbf9-5e6b6c81da53.png

2.session#931,serial#39657 也是处于等待状态,等待事件是'gc buffer busy acquire',而'gc buffer busy

acquire'的持有者是session#1324,serial#22503

1756814939153-67a56542-6e56-4036-94a1-a6d5c7cf862b.png

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

1756814939212-83ee67ed-72c4-4dd7-8332-ba95632e1571.png

通过分析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)