db2版本號為V9.7。
先說問題,如圖:
最近發現DB2數據庫占用內存達到10個G,前一段時間是7.2個G,在之前是4個多G。到底是什么占用了這么大的內存?以下是本人排查問題的步驟。
1、使用db2top對內存進行監控
發現數據庫緩存池占用內存很高
2、查看數據庫連接數
使用db2 list application進行查看,發現只有115個連接,並發並不高。
3、會不會是某個連接占用大量內存
停掉所有應用,對數據庫進行重啟。重啟后先不要啟動應用發現內存依舊占用這么高。說明跟前台應用沒有關系,同時也排除了內存泄露問題
4、查看數據庫配置文件
db2 get db cfg for <dbname> show detail
發現db2的內存都是自動管理的。
5、使用db2pd -db <dbname> -buff命令對緩沖池進行查看
可以看到IBMDEFAULTBP緩沖池數量非常的大,但是該緩沖池是自動管理的。
綜上所述,內存占用高原因分析:db2的內存是自動管理的,包括緩沖池。自動管理會按需分配內存,但是為什么內存只增長不釋放呢,個人感覺是因為空閑內存較多。當空閑內存較少時,db2會對內存進行釋放。
但是我數據庫的數據一共才4.8G,沒有必要配置這么大的緩沖池。那么如何手動調整呢?
執行db2 alter bufferpool IBMDEFAULTBP immediate size 100000(根據實際情況調整)命令
可以看到手工調整后緩沖池的數量變成了自己設置的數量,automatic變成了false;在用db2top查看會發現緩沖池內存值也相應發生了變化。
如何設置成自動調整呢?執行db2 alter bufferpool IBMDEFAULTBP immediate size 100000 automatic即可。
備注:在db2的內存中緩沖池內存的修改是即時生效的,不用重啟數據庫。