問題背景:
客戶反饋cpu負載較高,協助查看原因
1> awr報告
概述
---------------------
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。
以最簡單的雙節點RAC為例,當實例1發起一條select查詢某個block的時候,如果這個block不在本地的Buffer cache,但是能在實例2的buffer cache里找到,那么實例1的LMS進程會通過私網將這個block從實例2的cache獲取到實例1的cache,以避免physical reads,獲取過程中會出現gc cr block 2-way相關的等待事件,這就是cache fusion的基本功能,之后如果這個block沒有被任何一個實例更改,那么實例1與實例2訪問這個block就只需從本地的buffer cache讀取(假設buffer cache足夠大,block未被flush出buffer cache),本地讀取的情況下不會發生與gc相關的等待事件,對於同一個block只需跨節點傳輸一次,這是一種比較理想的情況。跨節點讀取除了這種以讀為主的情況外,還常見於以下場景:
實例1和實例2的buffer cache都含有這個block,T1時刻實例1修改了這個block,T2時刻實例2的會話讀取這個block時就會從實例1的buffer cache里讀過來,過程中實例2會話統計里就會觀察到gc cr block busy相關的等待事件。
—gc buffer busy acquire
沿用上面例子:實例1和實例2的buffer cache都含有某個block,T1時刻實例1修改了這個block,T2時刻實例2上的會話1讀取這個block,當這個讀取還沒有完成,實例2上的會話2也發起了讀取相同block的操作,這時會話2就會等在gc buffer busy acquire上。實例2同時發起的讀取相同block的會話數越多,我們就越容易觀察到gc buffer busy acquire等待。
—gc cr block busy
仍沿用上面例子:實例1和實例2的buffer cache都含有某個block,T1時刻實例1修改了這個block;T2時刻實例2上的會話1讀取這個block修改前的CR copy,因為CR copy需要通過應用undo record才能構造出來,且構造的過程中必須將改變記入到實例1的online redo,因此實例2會話1讀取的時候在可能會因為如下原因而發生gc cr block busy等待:
原因
---------------------
- 熱點塊(hot block)
在AWR中Segments by Global CacheBuffer 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
- 解決方法:
安裝Patch 13787307 或者 設置_gc_bypass_readers=false臨時規避這個問題。
另外,在11.2低版本中也有些類似的已知問題,建議安裝最新patch set (11.2.0.3/4)+ 最新PSU 。
Patch set和PSU信息請參考:Oracle RecommendedPatches -- Oracle Database (Doc ID 756671.1)
alter system set "_gc_bypass_readers=false"=false sid='*';
rac節點可以不停服務重啟