1. 程式人生 > >RAC效能分析 - gc buffer busy acquire 等待事件

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"。