最近在windows server 2012機器上在做性能測試時,發現8G物理內存,內存使用率占到了90%多,在“進程”列表中所有進程內存相加才2個多G,同時任務管理器->“性能”標簽一項中,非內存緩沖池很高占到了5個多G。
在網上找了一些資料,說是windows8系列有內存泄露的BUG,會引起“非內存緩沖池”一直占用很高。當前系統初步懷疑可能也是這個問題。
參考文檔:
一次DB服務器性能低下引發的對Nonpaged Pool Leak問題的診斷
http://tieba.baidu.com/p/2728129582
先使用poolmon.exe來分析哪個組件占用內存高,再對這個組件做相應的處理。
對於分頁緩沖池與非頁面緩沖池
PagedPool 和 NoPagedPool的區別、Windows kernel pool
1、頁面一直鎖定在物理內存中,不會被換出到頁面交換文件中
2、Windows把虛擬地址分為用戶地址空間和系統地址空間,用戶地址空間是給應用程序使用的,系統地址空間是給系統核心和驅動程序使用的。系統地址空間分為分頁池和非分頁池,分頁池是指映射到分頁文件的虛擬地址,當要使用該地址時才交換到物理內存中,由系統來調度;非分頁池是指直接在物理內存中分配的內存。“頁面緩沖池”就是進程占用的分頁池中的虛擬內存,是進程調用某些系統功能時,由系統核心或者驅動程序分配的。如果一個程序占用的頁面緩沖池內存不斷增大,就是內存泄露,通常應該是創建或打開了句柄沒有關閉。
在perfmon計數器里統計這兩個參數時,momory對象與process對象里都存在相關的值(兩種pool都會被映射到每一個進程空間內)。