2016-07-04 35 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

我同意,这是至关重要的信息。我希望在任务管理器中看到这一点,以表明我的系统*在过去存在多少内存压力。 我可以提供最好的近似对比正常设置为提交大小,但是这是不完美的,因为这种差异可以从网页还没有被触动,或者已经被调出图像文件,或调出到页面文件。 分页内存将最终成为一件坏事。 –

相关问题