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%也會寫臟數據
?到磁盤。
cache的原理? 通俗的說就是先通過hash chain找到內存塊讀數據,如果讀取的數據沒在內存塊,就要從磁盤讀數據到內存,讀入內存時哪個塊是空塊,或要換出內存被
?寫入磁盤數據由LRU決定。如果塊上的數據是臟數據就用dirtyLIST 管理,臟數據寫出后,該塊仍由LRU管理
LRU LIST 和 DIRTY LIST 統一稱為working set 他們也需要latch保護,因為他們是共享的用于管理內存的塊,需要latch防止數據的破壞
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态