buffer cache實驗6-latch:cache buffers lru chains

還不算暈發表於2014-02-26

1.working set與Latch:cache buffers lru chain:

每個working set都具有它自己的一組LRU和LRUW連結串列(LRU和LRUW連結串列總是成對出現的)。
ORACLE為了提高buffer cache效能(大記憶體),使用了多個working set
每個working set都由一個名為“Latch:cache buffers lru chain”的latch來保護,每一個lru latch對應一個working set。
而每個被載入到buffer cache的buffer header都以輪詢的方式掛到working set(包含的LRU連結串列)上去--。
而每個被載入到buffer cache的buffer header都以輪詢的方式掛到working set上去。也就是說,當buffer cache載入一個新的資料塊時,其對應的buffer header會去找一個可用的lru latch,如果沒有找到,則再找下一個lru latch,直到找到為止。如果輪詢完所有的lru latch也沒能找到可用的lru latch,該程式只有等待latch free等待事件,同時出現在v$session_wait中,並增加“latch misses”。
如果啟用了多個DBWR後臺程式的話,每個DBWR程式都會對應一個不同的working set,而且每個DBWR只會處理分配給它的working set,不會處理其他的working set。

2.cache buffers lru chain LATCH的個數:

ORACLE預設建立的cache buffers lru chain LATCH數量與CPU個數、DBWR個數相關。
DBWR小於4,個數為:4*CPU個數
DBWR大於4,個數為:DBWR*CPU個數
每個buffer pool使用自己的cache buffers lru chain LATCH,一個資料庫例項可以配置:DEFAULT,2KB,4KB,8KB,16KB,32KB,KEEP,RECYCLE 這8種型別的buffer pool,故cache buffers lru chain LATCH的數量最少為8個。詳見:點選開啟連結
或使用以下語句查出buffer cache中各個pool中cache buffers lru chain LATCH的獲取情況:  --語句來自周亮《ORACLE DBA實戰攻略》
SYS@ bys3>select d.blk_size,c.child#,p.bp_name,c.gets,c.sleeps from x$kcbwds d,v$latch_children c,x$kcbwbpd p where d.set_latch=c.addr and d.set_id between p.bp_lo_sid and p.bp_hi_sid order by c.child#;

  BLK_SIZE     CHILD# BP_NAME                    GETS     SLEEPS
---------- ---------- -------------------- ---------- ----------
      8192          1 KEEP                         18          0
      8192          3 RECYCLE                      18          0
      8192          5 DEFAULT                  864096        144
      2048          7 DEFAULT                      18          0
      4096          9 DEFAULT                      18          0
      8192         11 DEFAULT                      18          0
     16384         13 DEFAULT                      18          0
     32768         15 DEFAULT                      18          0

在我的虛擬機器中,CPU是一個,在10G中是有8個LRU LATCH,在11GR2中,是16個LRU LATCH.見:http://blog.csdn.net/haibusuanyun/article/details/19084583#t6

3.cache buffers lru chain LATCH在什麼情況下需要使用:

資料塊讀入buffer cache前需要獲得cache buffers lru chain LATCH--因為要到LRU上找空閒buffer
DBWR掃描LRUW連結串列前需要獲得cache buffers lru chain LATCH
SMON將空閒buffer移動至LRU輔助列,也需要cache buffers lru chain LATCH。

4.cache buffers lru chain LATCH在哪些情況下出現爭用:

簡單說就是多個程式同時檢索LRU/LRUW時出現。
具體情況有:   --物理讀過多引起爭用概念高。
多個會話併發訪問不同表或索引,因為這樣發生物理讀可能較大--由上面可知物理讀時需要在LRU找空閒buffer
髒塊過多,DBWR寫出慢(DBWR的效能不足-主機效能問題,或者磁碟I/O),涉及DBWR調優-在此不多討論。

注:CBC LATCH主要發生在邏輯讀時-多會話併發訪問相同的表或索引-相同表或索引多集中於幾條相同hash chain。


相關文章