昨天正式环境上出现数据库CPU 100%的问题,数据库是128个CPU,128G内存,power系列,非常强劲,十几万的逻辑读只需要1s。
出现问题之后,调整两条负载最高的两条SQL,问题解决,但有两个cluster类别的等待事件第一次见,在metlink中找了一篇文章:
gc buffer busy:--Gc缓冲区忙
gc buffer busy acquire: --Gc缓冲区获取忙
gc buffer busy release: --Gc缓冲区繁释放忙
--共享: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之前已经有远程实例的session#2请求访问了相同的buffer,并且没有完成,那么session#1等待gc buffer busy release。
--区别:原因/解决方法
---------------------
--1).热点块(hot block)
在AWR中 Segments by Global Cache Buffer Busy 记录了访问频繁的gc buffer.
--解决方法:
可以根据热点块的类型采取不同的解决方法,比如采取分区表,分区索引,反向index等等.--这点与单机数据库中的buffer busy waits类似.
--2).低效SQL语句
低效SQL语句会导致不必要的buffer被请求访问,增加了buffer busy的机会,在AWR中可以找到TOP SQL.
--解决方法:
可以优化SQL语句减少buffer访问。--这点与单机数据库中的buffer busy waits类似。
--3).数据交叉访问
RAC数据库,同一数据在不同数据库实例上被请求访问。
--解决方法:
如果应用程序可以实现,那么我们建议不同的应用功能/模块数据分布在不同的数据库实例上被访问,避免同一数据被多个实例交叉访问,可以减少buffer的争用,避免gc等待。
--4).Oracle bug
建议安装Oracle推荐的最新Patch Set和PSU。
Patch set和PSU信息请参考:Oracle Recommended Patches -- Oracle Database (Doc ID 756671.1)
当时数据库的负载,已经有几千个session堵塞了。