2016-07-04 108 views
2

是否有性能計數器,用於指示特定進程的內存量是多少?我有一個有40 GB可用RAM(128 GB物理內存)的服務器,但分頁的數據量超過100 GB。 我怎樣才能找出我的哪個進程負責那個巨大的頁面文件消耗?一個進程有多少內存被調出?

也可以通過一些xperf跟蹤來查看頁面輸出活動何時發生。但除了對頁面文件的許多寫入之外,我無法看到從哪個進程將內存寫入頁面文件。

參考設置跟蹤顯示我只是據我瞭解我過程的物理內存消耗有多大。但它似乎沒有跟蹤頁面的活動。

更新 的操作系統爲Windows Server 2012 R2

+1

我相信這是一個意外,但你忘了提及操作系統。不是我知道通過回答:) – Makketronix

回答

1

該ETW提供商"Microsoft-Windows-Kernel-Memory"有一個關鍵字"KERNEL_MEM_KEYWORD_WS_SWAP""0x80")。這裏有當數據被調出所發生的某些事件/分頁中:

 <event value="4" symbol="WorkingSetOutSwapStart" version="0" task="WorkingSetOutSwap" opcode="win:Start" level="win:Informational" keywords="KERNEL_MEM_KEYWORD_WS_SWAP" template="WorkingSetOutSwapStartArgs"/> 
    <event value="4" symbol="WorkingSetOutSwapStart_V1" version="1" task="WorkingSetOutSwap" opcode="win:Start" level="win:Informational" keywords="KERNEL_MEM_KEYWORD_WS_SWAP" template="WorkingSetOutSwapStartArgs_V1"/> 
    <event value="5" symbol="WorkingSetOutSwapStop" version="0" task="WorkingSetOutSwap" opcode="win:Stop" level="win:Informational" keywords="KERNEL_MEM_KEYWORD_WS_SWAP" template="WorkingSetOutSwapStopArgs"/> 
    <event value="5" symbol="WorkingSetOutSwapStop_V1" version="1" task="WorkingSetOutSwap" opcode="win:Stop" level="win:Informational" keywords="KERNEL_MEM_KEYWORD_WS_SWAP" template="WorkingSetOutSwapStopArgs_V1"/> 
    <event value="6" symbol="WorkingSetInSwapStart" version="0" task="WorkingSetInSwap" opcode="win:Start" level="win:Informational" keywords="KERNEL_MEM_KEYWORD_WS_SWAP" template="WorkingSetOutSwapStartArgs"/> 
    <event value="6" symbol="WorkingSetInSwapStart_V1" version="1" task="WorkingSetInSwap" opcode="win:Start" level="win:Informational" keywords="KERNEL_MEM_KEYWORD_WS_SWAP" template="WorkingSetOutSwapStartArgs_V1"/> 
    <event value="7" symbol="WorkingSetInSwapStop" version="0" task="WorkingSetInSwap" opcode="win:Stop" level="win:Informational" keywords="KERNEL_MEM_KEYWORD_WS_SWAP" template="WorkingSetInSwapStopArgs"/> 

在這裏,你得到像訪問頁數一些數據(PagesProcessed):

<template tid="WorkingSetOutSwapStartArgs"> 
    <data name="ProcessId" inType="win:UInt32"/> 
</template> 
<template tid="WorkingSetOutSwapStopArgs"> 
    <data name="ProcessId" inType="win:UInt32"/> 
    <data name="Status" inType="win:HexInt32"/> 
    <data name="PagesProcessed" inType="win:UInt32"/> 
</template> 
<template tid="WorkingSetInSwapStopArgs"> 
    <data name="ProcessId" inType="win:UInt32"/> 
    <data name="Status" inType="win:HexInt32"/> 
</template> 
<template tid="WorkingSetOutSwapStartArgs_V1"> 
    <data name="ProcessId" inType="win:UInt32"/> 
    <data name="Flags" inType="win:HexInt32"/> 
</template> 
<template tid="WorkingSetOutSwapStopArgs_V1"> 
    <data name="ProcessId" inType="win:UInt32"/> 
    <data name="Status" inType="win:HexInt32"/> 
    <data name="PagesProcessed" inType="win:Pointer"/> 
    <data name="WriteCombinePagesProcessed" inType="win:Pointer"/> 
    <data name="UncachedPagesProcessed" inType="win:Pointer"/> 
    <data name="CleanPagesProcessed" inType="win:Pointer"/> 
</template> 

玩它,如果它包括您需要的所有數據。

+0

此提供程序看起來不錯,但只有通過api調用強制轉換進程工作集纔會觸發換出事件。此提供程序不會記錄正常工作集修剪活動。至少跟蹤應用程序本身觸發的顯式替換是一個很好的暗示。 –

0

在Xperf要尋找Hard Faults - 注意,這是一個類型的Page Fault,但頁面錯誤通常可以在軟件中不接觸驅動器進行處理。您可以在任務管理器中添加一列以顯示每個進程的頁面錯誤。

您可以通過使用諸如https://technet.microsoft.com/en-us/sysinternals/vmmap.aspx之類的工具獲取關於進程的一些信息,該工具將告訴您進程地址空間中的每個內存塊是什麼類型以及提交了多少內存。但是,這是可以分頁的承諾內存,並且VirtualQueryEx()不會告訴您這一點。

另外值得一提的是,中調出存儲量大並不總是一件壞事 - 它是硬故障是緩慢的。

編輯:嗯,如果你想要一個侵入性的一次性測試我想有一個結合VirtualQueryEx()和ReadProcessMemory()來觸摸過程中每個提交頁面的黑客選項,所以你可以計算硬故障!

+0

我知道硬頁面錯誤。這是從頁面文件中分頁的內存。但我想知道什麼是從進程和什麼時候分頁到頁面文件中的。也許有人會明確地修整工作集,並且稍後會奇怪爲什麼他的過程具有如此高的響應時間...... –

+0

我同意,這是至關重要的信息。我希望在任務管理器中看到這一點,以表明我的系統*在過去存在多少內存壓力。 我可以提供最好的近似對比正常設置爲提交大小,但是這是不完美的,因爲這種差異可以從網頁還沒有被觸動,或者已經被調出圖像文件,或調出到頁面文件。 分頁內存將最終成爲一件壞事。 –

相關問題