buffer cache 記憶體管理物理結構純乾貨

flzhang發表於2017-06-30

buffer cache 裡有三種資料結構來管理記憶體空間

1 hash chain 2 LRU LIST 3 DIRTY LIST

hash chain 是為快速定位buffer cache中塊的結構,主要通過hash連結串列實現。每個hash桶對應一個hash鏈。鏈上每個header指向一個資料塊,
 一個hash latch管理多個hash桶。
 有對應隱含引數管理latch個數,和hash桶的個數。大概一個latch管理32個hash桶。latch就是桶上的鎖,如果兩個程式都已只讀方式讀取鏈上
 的兩個塊,那麼latch可以對只讀共享。如果一個程式讀一個塊,另一個程式要修改桶對應鏈上的另一個塊,就是獨佔方式訪問,於是要等前一個
 程式釋放latch才能用獨佔方式訪問這個塊。後一個程式在等待前一個程式釋放latch時,發生等待事件latch:cache buffers chains。
 對這個等待事件解決方法,可能遇到大量邏輯讀很多的sql,要邏輯讀,就要訪問一個塊,就可能獲取latch,引發大量latch:cache buffers chains
爭用,於是根據邏輯讀排序找出邏輯讀最多的sql,調整其執行計劃。
等待事件具體診斷可參考  latch:cache buffers chains的優化思路 http://blog.itpub.net/24742969/viewspace-1692853/

LRU list在快取初始載入時,所有buffer cache 塊都放到LRU list管理,從磁碟讀取資料到記憶體前,先檢視LRU list找到一個空塊,以便存放磁碟
 讀到記憶體的資料。讀LIST的時候如果有塊時髒塊,就把這樣的塊放到dirty LIST。掃描LRU list超過40%還沒找到空塊,停止掃描寫dirty LIST髒資料
 到磁碟,並給出free buffer wait等待事件,如果經常發生這個事件就要考慮加大Buffer Cache了。還有如果dirty LIST超過25%也會寫髒資料
 到磁碟。

通俗的說就是先通過hash chain找到記憶體塊讀資料,如果讀取的資料沒在記憶體塊,就要從磁碟讀資料到記憶體,讀入記憶體時哪個塊是空塊,或要換出記憶體被
 寫入磁碟資料由LRU決定。如果塊上的資料是髒資料就用dirtyLIST 管理,髒資料寫出後,該塊仍由LRU管理
LRU LIST 和 DIRTY LIST 統一稱為working set 他們也需要latch保護,因為他們是共享的用於管理記憶體的塊,需要latch防止資料的破壞

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

相關文章