深入淺出buffer cache和shared pool記載01
開始靜下心來好好看書了,再次翻看egyle的深入淺出的buffer cache於shared pool原理,看得夠嗆,eygle剖析得很有點深,記載以下書中的有些要點和個人理解!
Sga的buffer cache對oracle體系有些瞭解的都瞭解一些,使用者程式遞交請求給伺服器程式,伺服器程式不會在disk磁碟上直接獲取資料都會構造一個buffer cache的記憶體機構來快取資料,資料的修改 讀取都是在buffer cache獲取然後寫給磁碟,同樣在大多數os上也是採取的快取機制,自己最近也在看鳥哥的linux私房菜,檔案系統的e2和e3正是採用的快取機制交換資料,而且e3中還採用了oracle中的所謂的redo機制來實現資料的安全保障。
程式發出請求獲取資料,先確定在buffer cache中是否存在如果存在則根據block的狀態(scn)和查詢的scn來判斷是否需要從回滾段構造一致性讀取,如果資料在buffer cache不存在,則需要首先在buffer cache中尋找空閒空間然後從disk上獲取資料先到buffer cache中然後給相應的程式,期間可能會dbwn去寫出髒資料,釋放buffer空間!
Buffer cache中,透過幾個連結串列進行記憶體管理,LRU list和Dirty list,Dirty list又被稱為wirte list或者checkpoint queue,list上存放的都是buffer的指標。
LRU list用於維護記憶體中的buffer,按照LRU先進先出的佇列形式管理,資料庫初始化時,所有buffer都經過一個hash運算hash到LRU 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 list從LRU末端開始搜尋,掃描過程中發現的dirty buffer會移動到checkpoint queue上。此時如果掃描了LRU list的40%還沒有找到相應的空閒buffer,server程式會停止搜尋,通知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 list的dirty移到dirty list上去。
在9IR2時同時由於增量checkpoint,dbwn也會主動掃描LRU list,將發現的dirty buffer移動dirty list上去
Select kvittag,kvitval,kvitdsc from x$kvit where kvittag=’kcbdp’ 相應的資料字典查詢,不過在
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 list和Dirty list又分別增加了輔助list(AUXILIARY List),用於提高管理效率。
Alter session set events ‘immediate trace name buffers level
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1056767/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 深入淺出cache buffer和shared pool記載02
- 深入淺出buffer cache和shared pool記載03
- 《深入解析Oracle》第六章,Buffer Cache與Shared Pool原理Oracle
- 深入淺出-redo和undo記載01
- 深入淺出undo記載01
- 深入淺出sga和pga章節記載-01
- buffer cache 和shared pool詳解 診斷和解決ORA-04031 錯誤
- 深入淺出-redo和undo記載02
- 深入淺出redo和undo記載03
- 深入理解shared pool共享池之library cache系列一
- 深入理解shared pool共享池之library cache系列二
- 深入淺出undo記載02
- 深入淺出undo記載03
- 深入理解shared pool共享池之library cache的library cache lock系列四
- 深入理解shared pool共享池之library cache的library cache pin系列三
- 深入淺出等待事件和效能診斷記載03事件
- Shared Pool優化和Library Cache Latch衝突優化優化
- 等待模擬-library cache shared pool 硬解析
- Shared pool的library cache lock/pin及硬解析
- 故障排除:Shared Pool優化和Library Cache Latch衝突優化優化
- Shared pool深入分析及效能調整
- Buffer Cache(緩衝區快取)篇:keep pool(保留池)快取
- 深入淺出負載均衡負載
- shared pool記憶體結構記憶體
- 優化Shared Pool Latch與Library Cache Latch競爭優化
- shared pool library cache latch 競爭優化辦法優化
- Shared pool深入分析及效能調整(一)
- Shared pool深入分析及效能調整(二)
- 深入淺出等待事件和效能診斷01事件
- buffer cache 內部機制深入探索【一】
- MySQL入門--記憶體buffer poolMySql記憶體
- Oracle記憶體分配與使用小記(二)Shared Pool and Large PoolOracle記憶體
- 【BUFFER】Oracle buffer cache之 latch 學習記錄Oracle
- 【Shared Pool】使用DBMS_SHARED_POOL包將PL/SQL大物件儲存到Shared PoolSQL物件
- oracle buffer cache管理機制_buffer cache dump與lru機制小記Oracle
- Buffer和Cache的區別
- Cache 和 Buffer的區別
- Flush an Object Out The Library Cache [SGA] Using The DBMS_SHARED_POOLObject