深入淺出buffer cache和shared pool記載01

dotaddjj發表於2011-12-08

開始靜下心來好好看書了,再次翻看egyle的深入淺出的buffer cacheshared pool原理,看得夠嗆,eygle剖析得很有點深,記載以下書中的有些要點和個人理解!

Sgabuffer cacheoracle體系有些瞭解的都瞭解一些,使用者程式遞交請求給伺服器程式,伺服器程式不會在disk磁碟上直接獲取資料都會構造一個buffer cache的記憶體機構來快取資料,資料的修改 讀取都是在buffer cache獲取然後寫給磁碟,同樣在大多數os上也是採取的快取機制,自己最近也在看鳥哥的linux私房菜,檔案系統的e2e3正是採用的快取機制交換資料,而且e3中還採用了oracle中的所謂的redo機制來實現資料的安全保障。

程式發出請求獲取資料,先確定在buffer cache中是否存在如果存在則根據block的狀態(scn)和查詢的scn來判斷是否需要從回滾段構造一致性讀取,如果資料在buffer cache不存在,則需要首先在buffer cache中尋找空閒空間然後從disk上獲取資料先到buffer cache中然後給相應的程式,期間可能會dbwn去寫出髒資料,釋放buffer空間!

Buffer cache中,透過幾個連結串列進行記憶體管理,LRU listDirty listDirty list又被稱為wirte list或者checkpoint queue,list上存放的都是buffer的指標。

LRU list用於維護記憶體中的buffer,按照LRU先進先出的佇列形式管理,資料庫初始化時,所有buffer都經過一個hash運算hashLRU list上,如果一個程式需要需要讀取相應的資料,此時假定在buffer cache中不存在,oracle就需要從disk上獲取資料到相應的空閒buffer中,此時就需要掃描LRU list尋找空閒buffer,而資料一旦修改就會變為Dirty,也就可以被移動至Dirty list中去了(官方文件中也提到了最近最少使用列表LRU list中記錄的是可用緩衝區(free buffer),鎖定緩衝區(pinned buffer),及還沒被移入待寫列表的髒緩衝區。可用緩衝區內的資料無需繼續保留,可以用於儲存新資料。而鎖定緩衝區是正在被訪問的緩衝區。)之前自己也理解為LRU list上只會存放非dirty的塊,但是dirty list上卻是隻會存在dirty 塊。

這裡根據eygle的介紹細化一下關於資料的讀取:

1 server程式首先判斷資料在buffer中是否存在,存在即判斷是否需要根據回滾段構造一致性讀取,然後根據LRU list先進先出演算法在LRU list上移動相應的block,如果不存在則從磁碟獲取資料到buffer cache中。

2 此時由於需要把磁碟上相應的block擷取到buffer cache中,需要在buffer cache中查詢相應的空閒buffer用於存放,server程式會掃描LRU listLRU末端開始搜尋,掃描過程中發現的dirty buffer會移動到checkpoint queue上。此時如果掃描了LRU list40%還沒有找到相應的空閒bufferserver程式會停止搜尋,通知dbwn寫出,此時程式會處於free busy wait

Select kvittag,kvitval,kvitdsc from x$kvit where kvittag=’kcbfsp’ 相應的資料字典查詢

kcbfsp 40 Max percentage of LRU list foreground can scan for free

此時就會把LRU listdirty移到dirty list上去。

9IR2時同時由於增量checkpointdbwn也會主動掃描LRU list,將發現的dirty buffer移動dirty list上去

Select kvittag,kvitval,kvitdsc from x$kvit where kvittag=’kcbdp’ 相應的資料字典查詢,不過在10G後卻找不到這個閥值了!

Kcbdsp 25 max percentage of lru list dbwriter can scan for dirty

3 同樣如果checkpoint queue超過了閥值,也就是當檢查點佇列超過25%滿時,也會觸發dbwn

Select kvittag,kvitval,kvitdsc from x$kvit where kvittag=’kcbldq’ 相應的資料字典查詢

kcbldq 25 large dirty queue if kcbclw reaches this

4 如果找到足夠的buffer之後,server程式將從disk獲取資料到buffer cache,此時如果當前的buffer的相應的scn和查詢時刻的scn不一致,還需要從當前的block版本和回滾段構造構造相應的資料塊給使用者!

oracle8I開始,LRU listDirty list又分別增加了輔助listAUXILIARY List),用於提高管理效率。

Alter session set events ‘immediate trace name buffers level 4’轉儲buffers可以檢視具體的list資訊,其中還有其他分類的List(這個轉儲檔案很大,檢視一下max_dump_file_size引數,在10g中預設的為unlimited

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1056767/,如需轉載,請註明出處,否則將追究法律責任。

相關文章