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。
在某项目非功能容量测试过程中,发现部分交易响应时间明显变长,整体tps呈现下降趋势,通过awr抓包进行分析,确认是gc buffer busy造成。以下是问题分析过程,和大家一起研究学习。
通过分析awrrpt文件,发现Top 5 Timed Foreground Events中gc buffer busyacquire排名耗时第一:

分析Load profile可以看出此时cpu资源空闲

同时通过awrrpt文件可以看出数据访问基本是本地缓存,有少量访问远程节点

至此我们采取如下操作:
1,登陆数据库db01检查,确认gc buffer busy acquire事件的event_id
2,检查该事件在问题时段内出现的频率

3,检查snap 4393中导致该事件出现的原因

4,sql语句gmgpz0xht8yj7导致该事件出现的次数最多,分析该语句

发现了两个执行计划
执行计划1:

执行计划2:

5,得出结论:该SQL语句的执行计划不稳定。
采用第一种效率高,第二中执行计划效率低,第二种执行计划导致了事件“gc buffer busy acquire”出现。
6,解决方法:有两个方法,可以单独或同时实施
一是将该SQL的执行计划绑定在第一种;
二是重新搜集该表的统计信息,让oracle自动选择第一种;
最终测试中采用第二种方法,重新搜集该表的统计信息,执行计划,交易恢复正常。




