乙個用poolmon查詢記憶體洩露的例子

2021-04-22 08:39:14 字數 3539 閱讀 1801

poolmon.exe 使用說明: http://support.microsoft.com/kb/177415/en-us/

平台:window 2003 r2 sp1

故障描述一:客戶反映資料庫伺服器每隔幾天時間,客戶端就無法連線,提示監聽程式無法解析專有伺服器程序。

處理步驟一:首先判斷是否是由於

oracle

的sga

分配過大導致使用者無法建立新的連線,檢查作業系統得

/3gb

引數、oracle

的sga

引數和客戶端連線數,可以初步排除不是由於

sga分配過大導致的使用者無法建立新的連線

故障描述二:在跟蹤案例細節時,客戶反映故障發生時有時任務管理器都無法開啟

處理步驟二:任務管理器無法開啟可能是由於病毒引起,但是資料庫伺服器從來不會安裝執行新的軟體,而且也安裝了瑞星防毒軟體,應該可以排除病毒原因,繼續檢查系統核心記憶體,發現系統核心未分頁記憶體數在故障時達到

120m

,而且啟動時僅

30m左右,未分頁記憶體

120m

左右已經到達作業系統的限制了,因此可以斷定

oracle

無法建立新的連線和任務管理器無法開啟的原因都在於此。

處理步驟三:已經確定由於是無法分配未分頁記憶體導致的故障,下一步就應該查詢究竟是什麼程式持續占用了系統未分頁記憶體。這裡使用

windows

的poolmon

工具來進行監視。

執行poolmon

發現三個可以的

tag分別是

ddk,

mmcm

和r100

,這三個

tag都占用了較大的未分頁記憶體(

10m)。重新啟動伺服器後,再次執行

poolmon

觀察到mmcm

和r100

在啟動時就占用了較大的未分頁記憶體,與故障時相比變化不大,可以排除。

ddk在啟動時時僅占用

600k

左右的記憶體,可以斷定

ddk發生了記憶體洩漏。

處理步驟四:確認

ddk究竟是什麼咚咚,這裡借鑑了網上同仁的處理經驗,在此表示感謝。 檢查

pooltag.txt

看到ddk- - default for driver allocated memory (user's of ntddk.h)

說明ddk

是由驅動程式使用

搜尋使用

ddk使用的驅動程式

(再次感謝網上同仁提供的思路

) findstr /s /m /l "ddk" c:/windows/system32/drivers/*.sys

返回四個結果

basetdi.sysipvw32.sys storport.sys wdf01000.sys

其中後三個是

windows

自身的驅動,

basetdi.sys

為瑞星驅動

故障描述三:

windows

自身驅動可能性極小因此可以暫時排除,重點放在瑞星驅動上。有了目標後再次跟蹤,觀察到在晚上當系統空閒時未分頁空間的大小基本不會增長,而白天系統繁忙時未分頁空間的大小有著明顯的增長。

處理步驟五:聯想到和瑞星驅動相關的,乙個是本地

i/o被瑞星影響,乙個是網路

io被瑞星影響,而這些都和瑞星實時監控相關。於是停止瑞星實時監控,執行

poolmon

觀察到ddk

的值不再增長,在此確認是由於瑞星引起的記憶體洩漏。

結果:由於伺服器上極少去做操作,執行瑞星實時監控的必要性不大,因此建議使用者先停止瑞星實時監控以解決這個問題,然後聯絡瑞星公司處理

工具poolmon.exe

說明(xp

下可以用

memsnap

工具) 1.

使能tag

模式 在使用

poolmon

之前,你必須使能

tag模式並重新啟動伺服器。池

tag的特性是將收集和計算的資訊通過分配記憶體的

tag值進行排序。

注:使用

windows 2003

伺服器不需要使能

tag,它是

windows 2003

的預設值

方法一:編輯登錄檔

在hkey_local_machine/system/currentcontrolset/control/session manager

下增加鍵

globalflag

值0x00000400

(十六進製制);

重新啟動計算機。

方法二:使用

gflags.exe

工具 執行

gflags.exe

工具選擇

enable pool tagging

2.使用

poolmon.exe

工具收集資訊

使用以下步驟複製和儲存

tag資訊,以間隔

15分鐘的方式統計

2小時,新增資訊到文字中。

1.執行

windows

工具包中的程式

poolmon.exe

2.按p顯示未分頁池

3.按b按位元組大小排序

4.每十五分鐘儲存一次螢幕內容

在資料收集結束後,分析

tag資訊看看是否存在分配尺寸持續增長

附:poolmon.exe

命令說明:

語法:poolmon [itag][xtag][swtich]

itag

:列出匹配

tag名的池,可以使用萬用字元*和

? xtag

:列出不包含

tag名的池,可以使用萬用字元*和

? swtich:

p- 切換顯示未分頁或顯示已分頁或兩者都顯示

l- 切換是否高亮顯示值有變化的行

e- 在資料的底部顯示池合計值

h/? - 幫助

q- 退出

t- 按

tag名排序 a-

按分配尺寸

排序 f

- 按空閒尺寸

排序 d

- 按分配和空閒的差

排序 b

- 按使用位元組

排序 m -

按分配位元組排序

列說明:

tag:池分配的4位元組

tag type

:分頁或未分頁

allocs

:所有分配的計數

():分配列中與上次更新的差異

frees

:所有空閒的計數

():空閒列中與上次更新的差異

diff

:(allocs - frees

) bytes

:池消耗的合計位元組數

():位元組列中與上次更新的差異

per alloc

:(bytes/diff

查詢乙個流

2018 08 09 星期四 查詢乙個流 操縱當前的流位置往往會很有用.或許是應用程式正在讀取乙個基於記錄的複雜檔案.需要來回跳躍 亦或是流需要被重新設成檔案位置零.無論是何種情況,標準i o鏈結庫提供了一系列功能相當於lseek 系統呼叫的介面,例如,fseek 函式 最常見的標準i o查詢介面 ...

用C語言寫乙個記憶體管理程式

用c語言寫乙個記憶體管理程式 這個程式有2個系統呼叫和3種記憶體分配策略。並計算效能 平均記憶體利用率,尋找孔 hole 次數 系統呼叫 system calls 1 void mm request int n 這個系統呼叫是請求乙個連續的n位元組的記憶體塊 block 如果請求成功,返回乙個指標到...

用乙個屬性儲存乙個動態陣列

用乙個屬性儲存乙個動態陣列,可是弄了半天就是存不下來,象imagelist,等可以動態新增的控制項是如何實現儲存的,用動態陣列能實現嗎?請高手指點 如果不需要在設計時賦值,可以用tlist,tstringlist,tobjectlist儲存,然後宣告屬性及訪問方法,以字串為例 private fli...