首页 > 代码库 > [RAC性能调优] gc buffer busy acquire 处理
[RAC性能调优] gc buffer busy acquire 处理
目录(?)[+]
- RAC性能调优 gc buffer busy acquire 处理
[RAC性能调优] gc buffer busy acquire 处理
event 解释:
gcbufferbusyacquire是当session#1尝试请求访问远程实例(remote instance)buffer,但是在session#1之前已经有相同实例上另外一个session#2请求访问了相同的buffer,并且没有完成,那么session#1等待gcbufferbusyacquire。
原因/解决方法
---------------------
- 1.》热点块(hot block)
在AWR中Segments by Global Cache BufferBusy记录了访问频繁的gcbuffer.
解决方法可以根据热点块的类型采取不同的解决方法,比如采取分区表,分区索引,反向index等等。这点与单机数据库中的bufferbusywaits类似。
Segments by GlobalCache Buffer Busy
- % of Capture shows % of GC Buffer Busy for each top segment compared
- with GC Buffer Busy for all segments captured by the Snapshot
Owner | Tablespace Name | Object Name | Subobject Name | Obj. Type | GC Buffer Busy | % of Capture |
WMCADMIN | BILLDATA0 | FEEORDER_LOG_1404 |
| TABLE | 79,555,421 | 78.41 |
WMCADMIN | BILLINDEX0 | FEEORDER_LOG_1404_RSPCODETIME |
| INDEX | 21,779,575 | 21.47 |
WMCADMIN | BILLINDEX0 | IDX_BILLRING_INFO_1404_1 |
| INDEX | 125,829 | 0.12 |
SYS | SYSTEM | UET$ |
| TABLE | 182 | 0.00 |
SYS | SYSTEM | I_FILE#_BLOCK# |
| INDEX | 62 | 0.00 |
- 2》低效SQL语句
低效SQL语句会导致不必要的buffer被请求访问,增加了bufferbusy的机会。在AWR中可以找到TOP SQL。解决方法可以优化SQL语句减少buffer访问。这点与单机数据库中的bufferbusy waits类似。
Buffer Gets | Executions | Gets per Exec | %Total | Elapsed Time (s) | %CPU | %IO | SQL Id | SQL Module | SQL Text |
539,775,845 | 8 | 67,471,980.63 | 44.45 | 80,098.98 | 16.9 | 17.4 | 0mtunwsd5p9z1 | SQL*Plus | SELECT ‘Result ‘ || ( SELECT C... |
520,003,254 | 7 | 74,286,179.14 | 42.82 | 72,983.93 | 19 | 19 | bx100749tk78y | SQL*Plus | select ‘Result ‘ || successall... |
相应的sql为:
SELECT ‘Result ‘ || ( SELECT COUNT(1) FROMfeeorder_log_1404 WHERE requestdata >SYSDATE - 5 / 1440 AND requestdata <= SYSDATE AND rspcode=‘000000‘ ANDSUBSTR(copyrightid, -1, 1)=‘1‘ ) || ‘ ‘ || ( SELECT COUNT(1) FROMfeeorder_log_1404 WHERErequestdata > SYSDATE - 5 / 1440 AND requestdata <= SYSDATE ANDSUBSTR(copyrightid, -1, 1)=‘1‘ ) FROM dual
select ‘Result ‘ || successall ||‘ ‘|| requestall from (selectcount(1) as requestall fromfeeorder_log_1404where REQUESTDATA>sysdate-5/1440 and REQUESTDATA<=sysdate), (selectcount(1) as successall fromfeeorder_log_1404where REQUESTDATA>sysdate-5/1440 and REQUESTDATA <=sysdate and RspCode =‘000000‘)
--3》。数据交叉访问。
RAC数据库,同一数据在不同数据库实例上被请求访问。
如果应用程序可以实现,那么我们建议不同的应用功能/模块数据分布在不同的数据库实例上被访问,避免同一数据被多个实例交叉访问,可以减少buffer的争用,避免gc等待。
--4》-可能为Oracle bug
建议安装Oracle推荐的最新Patch Set和PSU。
Patch set和PSU信息请参考:Oracle Recommended Patches -- Oracle Database (Doc ID 756671.1)
如果问题还在的话,可以做一下一下操作:
RAC数据库收集hanganalyze的命令:
SQL> conn / as sysdba
SQL> oradebug setmypid
SQL> oradebug unlimit
SQL> oradebug -g all hanganalyze 3