背景知識(shí)
緩沖池是內(nèi)存中的一塊存儲(chǔ)區(qū)域,用于臨時(shí)讀入和更改數(shù)據(jù)庫(kù)頁(yè)(包含表行或索引項(xiàng))。緩沖池的用途是為了提高數(shù)據(jù)庫(kù)系統(tǒng)的性能。從內(nèi)存訪問數(shù)據(jù)要比從磁盤訪問數(shù)據(jù)快得多。因此,數(shù)據(jù)庫(kù)管理器需要從磁盤讀取或?qū)懭氪疟P的次數(shù)越少,性能就越好。對(duì)一個(gè)或多個(gè)緩沖池進(jìn)行配置之所以是調(diào)優(yōu)的最重要方面,是因?yàn)檫B接至數(shù)據(jù)庫(kù)的應(yīng)用程序的大多數(shù)數(shù)據(jù)(不包括大對(duì)象和長(zhǎng)字段數(shù)據(jù))操作都在緩沖池中進(jìn)行。
缺省情況下,應(yīng)用程序使用緩沖池 IBMDEFAULTBP,它是在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)創(chuàng)建的。當(dāng) SYSCAT.BUFFERPOOLS 目錄表中該緩沖池的 NPAGES 值為 -1 時(shí),DB2 數(shù)據(jù)庫(kù)配置參數(shù) BUFFPAGE 控制著緩沖池的大小。否則會(huì)忽略 BUFFPAGE 參數(shù),并且用 NPAGES 參數(shù)所指定的頁(yè)數(shù)創(chuàng)建緩沖池。
建議
對(duì)于僅使用一個(gè)緩沖池的應(yīng)用程序,將 NPAGES 更改成 -1,這樣 BUFFPAGE 就可以控制該緩沖池的大小。這使得更新和報(bào)告緩沖池大小以及其它 DB2 數(shù)據(jù)庫(kù)配置參數(shù)變得更加方便。
確??梢允褂脭?shù)據(jù)庫(kù)配置中的 BUFFPAGE 參數(shù)來控制緩沖池大小之后,將該參數(shù)設(shè)置成合適的值。根據(jù)數(shù)據(jù)庫(kù)的大小和應(yīng)用程序的性質(zhì)將該參數(shù)設(shè)置成一個(gè)合理的大值,這種做法很安全。通常,該參數(shù)的缺省值非常小,可能滿足不了要求。請(qǐng)考慮下列情況:
一開始,如果您的機(jī)器上有足夠大的內(nèi)存,請(qǐng)將 BUFFPAGE 設(shè)置成 40000 個(gè)頁(yè)(160 MB),或者等于機(jī)器總內(nèi)存的 10%。
對(duì)于大型 OLTP 數(shù)據(jù)庫(kù),在保持系統(tǒng)穩(wěn)定的同時(shí)為緩沖池留出盡可能多的內(nèi)存。一開始,先嘗試使用 1.6 GB 的內(nèi)存,然后嘗試用更多內(nèi)存。
如何更改該參數(shù)
運(yùn)行下面這個(gè)腳本,以便:
驗(yàn)證目錄值
啟用數(shù)據(jù)庫(kù)配置參數(shù) BUFFPAGE
更新所有數(shù)據(jù)庫(kù)的 BUFFPAGE 值。
db2 -v connect to DB_NAME
db2 -v select * from syscat.bufferpools
db2 -v alter bufferpool IBMDEFAULTBP size -1
db2 -v connect reset
db2 -v update db cfg for dbname using BUFFPAGE bigger_value
db2 -v terminate
研究步驟
要確定數(shù)據(jù)庫(kù)的緩沖池大小是否由 BUFFPAGE 參數(shù)所決定,請(qǐng)運(yùn)行:
db2 -v connect to DB_NAME
db2 -v SELECT * from SYSCAT.BUFFERPOOLS
db2 -v connect reset
db2 -v terminate
檢查結(jié)果。如果每個(gè)緩沖池都有一個(gè)為“-1”的 NPAGES 值,那么緩沖池大小是由數(shù)據(jù)庫(kù)配置中的 BUFFPAGE 參數(shù)控制的。
要確定緩沖池大小是否足夠大,請(qǐng)?jiān)谶\(yùn)行應(yīng)用程序時(shí)收集數(shù)據(jù)庫(kù)和/或緩沖池的快照。類似于下面的腳本為您提供這些所需的信息:
db2 -v update monitor switches using bufferpool on
db2 -v get monitor switches
db2 -v reset monitor all
-- run your application --
db2 -v get snapshot for all databases > snap.out
db2 -v get snapshot for dbm >> snap.out
db2 -v get snapshot for all bufferpools >> snap.out
db2 -v reset monitor all
db2 -v terminate
請(qǐng)確保您在斷開數(shù)據(jù)庫(kù)連接之前發(fā)出“db2 -v get snapshot”。當(dāng)最后一個(gè)應(yīng)用程序與數(shù)據(jù)庫(kù)斷開連接時(shí),該數(shù)據(jù)庫(kù)停止運(yùn)行,同時(shí)所有快照統(tǒng)計(jì)信息將會(huì)丟失。要確保一直存在使數(shù)據(jù)庫(kù)處于正常運(yùn)行狀態(tài)的連接,請(qǐng)使用下列方法之一:
在收集快照的窗口中保持一個(gè)單獨(dú)的連接。
使用 DB2 ACTIVATE DATABASE 命令。
在數(shù)據(jù)庫(kù)快照或緩沖池快照的快照輸出中,查找下列“logical reads”和“physical reads”,這樣就可以計(jì)算出緩沖池命中率,它可以幫助您調(diào)優(yōu)緩沖池:
-- Related lines from a sample of bufferpool snapshots --
Buffer pool data logical reads = 702033
Buffer pool data physical reads = 0
Buffer pool data writes = 414
Buffer pool index logical reads = 168255
Buffer pool index physical reads = 0
緩沖池命中率表明數(shù)據(jù)庫(kù)管理器不需要從磁盤裝入頁(yè)(即該頁(yè)已經(jīng)在緩沖池中)就能處理頁(yè)請(qǐng)求的時(shí)間百分比。緩沖池的命中率越高,使用磁盤 I/O 的頻率就越低。按如下計(jì)算緩沖池命中率:
(1 - ((buffer pool data physical reads + buffer pool index physical reads) /
(buffer pool data logical reads + pool index logical reads))
) * 100%
這個(gè)計(jì)算考慮了緩沖池高速緩存的所有頁(yè)(索引和數(shù)據(jù))。理想情況下,該比率應(yīng)當(dāng)超過 95%,并盡可能接近 100%。要提高緩沖池命中率,請(qǐng)嘗試下面這些方法:
增加緩沖池大小。
考慮分配多個(gè)緩沖池,如果可能的話,為每個(gè)經(jīng)常被訪問的大表所屬的表空間分配一個(gè)緩沖池,為一組小表分配一個(gè)緩沖池,然后嘗試一下使用不同大小的緩沖池以查看哪種組合會(huì)提供最佳性能。
如果已分配的內(nèi)存不能幫助提高性能,那么請(qǐng)避免給緩沖池分配過多的內(nèi)存。應(yīng)當(dāng)根據(jù)取自測(cè)試環(huán)境的快照信息來決定緩沖池的大小。