天天看點

Oracle wait event --- buffer cache

http://m.blog.itpub.net/12679300/viewspace-1244578/

Oracle wait event --- buffer cache
Oracle wait event --- buffer cache

Buffer Cache是SGA的一部分,Oracle利用Buffer Cache來管理data block,Buffer Cache的最終目的就是盡可能的減少磁盤I/O。 Buffer Cache中主要有3大結構用來管理Buffer Cache:Hash Bucket、Hash Chain List、LRU List;   

Hash Bucket & Hash Chain List:Hash Bucket與Hash Chain List用來實作data block的快速定位。 注意:Hash Chain結構是在共享池中,使用典型記憶體結構Bucket->Chain->Header結構進行管理。而實際緩沖區資訊存儲在高速緩沖區中。

LRU List:挂載有指向具體的free buffer, pinned buffer以及還沒有被移動到 write list的dirty buffer 等資訊。所謂的free buffer就是指沒有包含任何資料的buffer,所謂的pinned buffer,就是指目前正在被通路的buffer。   

Write(Dirty)List:挂載有指向具體的 dirty block的資訊。所謂的dirty block,就是指在 buffer cache中被修改過但是還沒有被寫入到磁盤的block。

使用者記憶體中讀資料的順序:

a) 對該Block運用Hash算法,得到Hash值。

b)獲得cache buffers chains latch 

c) 到相應的Hash Bucket中搜尋相應Buffer Header

d) 如果找到相應的Buffer Header,然後判斷該Buffer的狀态,看是否需要構造CR Block,或者Buffer處于pin的狀态,最後讀取。

e) 如果找不到,就從磁盤讀入到Buffer Cache中。

邏輯讀的過程

  1、Oracle以每個塊的file#+block#和類型做HASH運算,得到HASH值。根據HASH值,到HASH表中取出指定塊的記憶體位址

  2、擷取CBC Latch(實驗的重點測試部分)

  3、根據HASH值,搜尋CBC連結清單

  4、根據DBA找到BH(Buffer Header)加Buffer Pin

  5、加完Buffer Pin馬上釋放CBC Latch

  6、通路Buffer開始fetch資料

  7、擷取CBC Latch

  8、釋放Buffer Pin

  9、釋放CBC Latch

latch: cache buffer chains: 

一個cache buffers chain Latch管理多個Hash Chain。 當多個程序同時檢索Buffer Cache時,獲得cache buffers chain Latch的過程中發生争用,就會産生 latch: cache buffers chain等待事件。

現象:大量的latch: cache buffers chains等待事件導緻系統消耗量大量的CPU,最終導緻系統hang住。

原因:1) 執行效率低下的SQL語句,多個程序同時掃描大範圍的表或索引時;2)熱點塊争用;3)Hash Bucket太少;4)Hash Chain太長,掃描清單時間長;

總結以上的特征:

a)  占用大量的CPU資源;

b)  邏輯讀比正常情況要多很多;

c)  等待事件裡面肯定有latch: cache buffers chains

d)  Latch的命中率一般在95%以下,嚴重的在90%以下;

http://blog.itpub.net/12798004/viewspace-1818231/ 

在Oracle9i以前,如果其它使用者程序已經獲得了這個latch,那麼新的程序就必須等待,直到該使用者程序搜尋完畢(搜尋完畢之後就會釋放該latch)。從Oracle9i開始 cache buffers chains latch可以隻讀共享,也就是說使用者程序A以隻讀(select)的方式通路Block,這個時候獲得了該latch,同時使用者程序B也以隻讀的方式通路Block,那麼這個時候由于是隻讀的通路,使用者程序B也可以獲得該latch。但是,如果使用者程序B要以獨占的方式通路Block,那麼使用者程序B就會等待使用者程序A釋放該latch,這個時候Oracle就會對使用者程序B标記一個latch:cache buffers chains的等待事件。

free buffer waits:是由于無法找到可用的buffer cache 空閑區域,需要等待DBWR 寫入完成引起 

  • 一般是由于
  • 低效的sql
  • 過小的buffer cache
  • DBWR 工作負荷過量

  buffer busy waits:

read by other session:

buffer busy wait/ read by other session  一般以上2個等待事件可以歸為一起處理,建議客戶都進行監控 。 以上等待時間可以由如下操作引起

  • select/select —- read by other session: 由于需要從 資料檔案中将資料塊讀入 buffer cache 中引起,有可能是 大量的 邏輯/實體讀  ;或者過小的 buffer cache 引起
  • select/update —- buffer busy waits/ read by other session  是由于更新某資料塊後 需要在undo 中 重建建構 過去時間的塊,有可能伴生 enq:cr-contention 是由于大量的實體讀/邏輯讀造成。
  • update/update —- buffer busy waits 由于更新同一個資料塊(非同一行,同一行是enq:TX-contention) 此類問題是熱點塊造成
  • insert/insert —- buffer busy waits  是由于freelist 争用造成,可以将表空間更改為ASSM 管理 或者加大freelist 。

latch: in memory undo latch

write complete waits