db2資料庫在執行時會占用不少的系統記憶體。db2按三個級別來管理記憶體(由oss元件向其他元件提供):記憶體集、記憶體池和記憶體塊。記憶體塊組成記憶體池。記憶體池屬於乙個記憶體集。記憶體集裡有多個記憶體池。緩衝池(bufferpool)就其中的一種記憶體池,這型別記憶體池消耗的記憶體數量最大。bufferpool裡裝載的是從表空間裡讀進的頁(資料或索引)。
bufferpool可以有多個。每乙個都有自己的配置資訊。這些配置資訊存放在sqlbp.1檔案(放於例項目錄下,sqlbp.2是其備份)和系統編目表syscat.bufferpools。
sqlbp.1檔案中有兩種重要的資訊:sqlb_bufferpool_hearder記錄和sqlb_bufferpool_cb記錄。
sqlb_bufferpool_hearder記錄:
1)儲存當前buffperpool的個數
2)哪些bufferpool使用了標準頁大小和數量,哪些使用了非標準頁大小和數量
sqlb_bufferpool_cb記錄:
1)乙個buffperpool對應一條sqlb_bufferpool_cb記錄
2)佔256位元組
2)包含:bufferpool的名稱、id、頁大小、頁數、lifelsn
db2的buffperpool是以頁為單位來管理的。每一頁有乙個bpd(緩衝池頁描述符),約100位元組大小。所有bpd都儲存在另乙個記憶體池db_heap(資料庫堆)。bpd包含的資料結構和資訊如下:
1)flags,取值包括
dirty,已被修改
new,剛被預取讀入
prefetch_saw_it,預讀程式準備讀入時發現已在記憶體
prefetch_to_purge,預讀程式將清除該頁
prefetch_to_hate,被預讀程式選為victim頁而覆蓋
2)fixcount計數,記錄頁面被引用的次數,>0表示正在被訪問,不能換出
3)指向hash鍊錶的指標(hashprev/hashnext)
4)指向hate鍊錶的指標(hateprev/hatenext)
5)指向dirty鍊錶的指標(dirtyprev/dirtynext)
6)bufferpool的池id
7)頁面對應物件的id
8)頁面對應物件的內容
9)緩衝池的頁數
10)頁面對應物件的頁數
11)hflag,只是是否被連線到hate鍊錶(值為0或對應鍊錶的索引)
12)hashidx,hash桶的桶號(用池id、物件id、物件型別和頁面號計算),-1表示未連線,-2表示選中做victim頁
13)dflag,是否連線到dirty表
14)weight,反映頁面再次被引用的可能性(由使用過頁面的agent釋放控制權時設定)
15)pminlsn,頁在記憶體中第一次修改時產生的日誌lsn號
hash桶
hash桶主要用來快速查詢頁面。hash桶的個數約是bufferpool頁面的1.5倍。每個桶都有乙個指標指向該桶的第乙個頁面,通過該頁的hash鍊錶指標,db2可以遍歷整個bufferpool,由此找到想要的頁或發現沒有合適的頁(bufferpool miss)
hate鍊錶
遇到bufferpool miss時,db2會檢查hate鍊錶以找到乙個victim頁用於與將要讀進的頁替換。hate鍊錶中fixcount為0而且weight為0的頁面會被選中做victim頁。通過頁面的hate鍊錶指標,db2遍歷整個hate鍊錶,由此找到合適的victim頁或發現沒有合適的頁。
時鐘演算法
bufferpool的頁面通過指標一頁接一頁串聯起來成為一條鏈。實際上這條鏈是首尾相接的,形成乙個環。在遍歷hate鍊錶後仍然沒有找到合適的victim頁後,db2再次按環的情形遍歷bufferpool中的searchcount個頁面,尋找fixcount為0而且weight最小的頁作為victim頁(盡量選非髒頁)。如果仍然沒有找到合適的頁,bufferpool滿的錯誤就會產生。
新頁面置換演算法
在較新版本的db2中,把註冊標量db2_user_alternate_page_cleaning設為yes會啟用新的頁面置換演算法。新演算法需要num_ioserver至少為3。
預取
當預取觸發點達到後,預取就會發生。 這個觸發點是prefetch size倍數的頁面個數。順序檢測會導致預取。bufferpool size、prefetch size和access plan都會影響是否預取和預取數量。預取請求被拆分成prefetch szie/extent size個放入共享佇列。預取服務程序按fifo方式提取和執行請求。
清除
被修改過的頁面是髒頁,需要在合適的時候寫入到磁碟。頁面清除程序負責這個任務。觸發清除有以下情況:
1)bufferpool中的髒頁所佔百分比超過了資料庫配置引數chngpgs_thresh
2)記憶體中最大的lsn與寫入日誌檔案最老的事務lsn間隔超過了資料庫配置引數softmax的值
3)選中的victim頁是髒頁
清除觸發時,執行以下動作:
1)從觸發的dirty鍊錶上收集頁面,最大400個或收集到的lsn不再老為止
2)同時寫入收集到的頁面
3)檢查觸發條件是否仍滿足,若是,繼續下一輪動作
小結bufferpool上發生的過程有:頁面查詢、頁面置換、頁面預取和頁面清除。
本文參考和引用牛新莊的《深入解析db2》
db2 的緩衝池設計
最近接到一些朋友的信,問一些關於緩衝區管理的問題。俺想藉此機會也寫個短篇總結一下 什麼是緩衝區管理 很多使用者可能都有疑問,緩衝區是不是越大越好,是乙個單獨的大緩衝池好還是若干個稍小的緩衝池好。總地來說,這個問題沒有乙個標準答案。在俺的經驗中,緩衝區管理可以歸納為兩個字 質,量 緩衝池的作用是把資料...
DB2緩衝池 表空間
在db2中建立表空間得指向該錶空間所屬緩衝池,否則表空間指向預設緩衝池 1.緩衝池 1.1 建立緩衝池 語法 create bufferpool size pagesize 例項 create bufferpool oliver buffer immediate size 250 pagesize ...
DB2緩衝池 表空間
在db2中建立表空間得指向該錶空間所屬緩衝池,否則表空間指向預設緩衝池 1.緩衝池 1.1 建立緩衝池 語法 create bufferpool size pagesize 例項 create bufferpool oliver buffer immediate size 250 pagesize ...