深入分析LRU與DIRTY LIST(轉)
在BUFFER CACHE中,oracle通過幾個連結串列進行記憶體管理,最為人熟知的是LRU LIST與DIRTY LIST(WRITE LIST或CHECKPOINT QUENE),各個LIST上存放的是指向具體BUFFER的指標。
注:除LRU和DIRTY LIST這兩個重要連結串列之外,BUFFER CACHE的管理還存在另外兩個重要的資料結構:hash bucket和cache buffer chain。
具體的LRU演算法不多說了,下面就BUFFER的原理及使用做個簡單介紹:
1、當一個SERVER程式需要讀資料到BUFFER CACHE中時,首先會判斷BUFFER是否存在,如果存在且可用,則獲取該資料,如果BUFFER中不存在該資料,則需要從資料檔案中讀取。
2、在讀取資料之前,SERVER程式需要掃描LRU LIST需找FREE的BUFFER,掃描過程中SERVER程式會把發現的所有已經被修改過的BUFFER移動到CHECKPOINT QUENE上,這些DIRTY BUFFER隨後可以被寫出到資料檔案中。
3、如果CHECKPOINT QUENE超過了閥值,SERVER程式就會通知DBWn去寫出髒資料,這是觸發DBWn寫的一個條件,這個閥值是25%,也就是檢查點佇列超過25%時就會觸發DBWn的寫操作。
SQL> select kvittag,kvitval,kvitdsc from x$kvit
2 where kvittag='kcbldq';
KVITTAG KVITVAL
---------------------------------------------------------------- ----------
KVITDSC
----------------------------------------------------------------
kcbldq 25
large dirty queue if kcbclw reaches this
如果SERVER程式掃描LRU超過一個閥值仍然不能找到足夠的FREE BUFFER,將停止需找,轉而通知DBWn去寫出髒資料,釋放記憶體空間。這個閥值是40%
SQL> select kvittag,kvitval,kvitdsc from x$kvit
2 where kvittag='kcbfsp';
KVITTAG KVITVAL
---------------------------------------------------------------- ----------
KVITDSC
----------------------------------------------------------------
kcbfsp 40
Max percentage of LRU list foreground can scan for free
4、找到足夠的BUFFER之後,SERVER程式就可以將資料從資料檔案讀入BUFFER CACHE中。
5、如果讀取的BLOCK不滿足讀一致性需求,則SERVER程式需要通過當前BLOCK版本和回滾段構造前映象返回給使用者。
從ORACLE 8i開始LRU LIST和DIRTY LIST又分別增加了輔助LIST(AUXILIARY LIST),引入輔助LIST之後,當資料庫初始化時,BUFFER首先存放在LRU的輔助LIST上,當被使用後移動到LRU住LIST上(MAIN PRL_LIST),這樣使用者程式搜尋FREE BUFFER時,就可以從LRU-AUX LIST開始,而DBWR搜尋DIRTY BUFFER時,則可以從LRU-MAIN LIST開始,從而提高搜尋效率和資料庫效能。
可以通過如下命令轉儲BUFFER CACHE內容,從而清晰地看到以上描述的資料結構:
alter session set events 'immediate trace name buffers level n';
不同LEVEL轉儲的內容詳細程度不同,此命令可用級別主要有1~10級,各級別含義如下:
LEVEL 1:僅包含BUFFER HEADERS資訊。
LEVEL 2:包含BUFFER HEADERS和BUFFER概要資訊轉儲。
LEVEL 3:包含BUFFER HEADERS和完整BUFFER內容轉儲。
LEVEL 4:LEVEL1 + LATCH轉儲 + LRU佇列。
LEVEL 5:LEVEL4 + BUFFER概要資訊轉儲。
LEVEL 6和LEVEL 7:LEVEL4 + 完整的BUFFER內容轉儲。
LEVEL 8:LEVEL4 + 顯示users/waiters資訊。
LEVEL 9:LEVEL5 + 顯示users/waiters資訊。
LEVEL 10:LEVEL6 + 顯示users/waiters資訊。
SQL> alter session set events 'immediate trace name buffers level 4';
會話已更改。
在跟蹤檔案中找到了我想要看到的:
MAIN RPL_LST Queue header (NEXT_DIRECTION)[24be8c70,24bf3a7c]
24BE8C1C=>247E7BF4=>247E7848=>247E7904=>247E7CB0=>247E79C0=>247E7D6C=>247E7A7C
247E7B38=>247E7E28=>24BE8CD8=>247F7F30=>247F7FEC=>24BE8290=>247E7EE4=>247E7FA0
247E805C=>247E8118=>247E81D4=>247E8290=>247E834C=>247E8408=>247E84C4=>247E8580
.........................
MAIN RPL_LST Queue header (PREV_DIRECTION)[24be8c70,24bf3a7c]
24BF3A28=>24BF3AE4=>24BF3BA0=>24BF3C5C=>24BF3D18=>24BF3DD4=>24BF3E90=>24BF3F4C
24BF4008=>24BF40C4=>24BF4A50=>25FF2ABC=>24BEAD28=>24BEBC94=>24BEC040=>24BEBEC8
24BEB480=>24BEB770=>257E778C=>257E7848=>257E7904=>257E7D6C=>277F947C=>277F976C
.........................
MAIN WRT_LST Queue header (NEXT_DIRECTION)[NULL]
MAIN WRT_LST Queue header (PREV_DIRECTION)[NULL]
AUXILIARY WRT_LST Queue header (NEXT_DIRECTION)[NULL]
AUXILIARY WRT_LST Queue header (PREV_DIRECTION)[NULL]
MAIN XOBJ_LST Queue header (NEXT_DIRECTION)[NULL]
MAIN XOBJ_LST Queue header (PREV_DIRECTION)[NULL]
AUXILIARY XOBJ_LST Queue header (NEXT_DIRECTION)[NULL]
AUXILIARY XOBJ_LST Queue header (PREV_DIRECTION)[NULL]
MAIN XRNG_LST Queue header (NEXT_DIRECTION)[NULL]
MAIN XRNG_LST Queue header (PREV_DIRECTION)[NULL]
AUXILIARY XRNG_LST Queue header (NEXT_DIRECTION)[NULL]
AUXILIARY XRNG_LST Queue header (PREV_DIRECTION)[NULL]
MAIN REQ_LST Queue header (NEXT_DIRECTION)[NULL]
MAIN REQ_LST Queue header (PREV_DIRECTION)[NULL]
AUXILIARY REQ_LST Queue header (NEXT_DIRECTION)[NULL]
AUXILIARY REQ_LST Queue header (PREV_DIRECTION)[NULL]
紅色部分我們可以清晰的看到LRU主LIST的佇列資訊,很直觀的連結串列。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25964700/viewspace-703109/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- list與字串轉換字串
- DataTable與List相互轉換
- LRU原理與實現
- JPA 實體髒檢查與儲存同步(Dirty & Flush)
- Java中List與陣列互轉Java陣列
- zt_oracle LRU與MRUOracle
- OCP知識點講解 之 LRU鏈與髒LRU鏈
- List ,Set,Map集合與陣列互轉陣列
- 陣列與集合List的相互轉化陣列
- 轉:java中陣列與List相互轉換的方法Java陣列
- 【Oracle】-【LRU和DBWR】-LRU演算法與DBWR中的應用Oracle演算法
- va_list/va_start/va_arg/va_end深入分析
- TLB與cache的深入分析
- 簡單易用的JSON與List相互轉換JSON
- lru
- session效能的影響,後臺 flush dirtySession
- json字串與Object、List、Map的互轉工具類JSON字串Object
- c#中Array,ArrayList 與List<T>的區別、共性與轉換C#
- Tensor與tensor深入分析與異同
- 轉:linux io排程深入分析Linux
- List集合轉JSONObjectJSONObject
- c# DataTable轉ListC#
- DataTable 轉為 List<dynamic>
- Java中 set,list,array(集合與陣列)、Map相互轉換Java陣列
- Hql總結 查詢結果動態組裝成List(map),List(bean),List(list),List(set)等格式(轉)Bean
- list-style與list-style-type的區別
- 容器,型別轉換。List。型別
- List和ObservableCollection的轉換
- 深入分析Spring 與 Spring MVC容器SpringMVC
- Android快取機制-LRU cache原理與用法Android快取
- LRU快取快取
- Java 的 Collection 與 List 集合Java
- 轉抄:Oracle資料塊深入分析總結Oracle
- Linux的結構和特性深入分析(轉)Linux
- 深入分析Linux系統深度安全加固(轉)Linux
- html中list-style-type與list-style的區別HTML
- 陣列轉換成List集合陣列
- Java中List陣列互轉Java陣列