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