是否有性能计数器,表明特定进程的内存有多少被分页?我有一台服务器,它有40 GB的可用内存(128 GB物理内存),但分页的数据量超过100 GB。 如何找出我的哪个进程负责该庞大的页面文件消耗?
也可以使用一些xperf跟踪来查看页面输出活动何时发生。但是除了对页面文件的许多写入之外,我无法看到内存写入页面文件的进程。
参考集跟踪仅在我理解的情况下向我展示了我的进程的物理内存消耗量有多大。但它似乎没有追踪页面活动。
更新 操作系统是Windows Server 2012 R2
答案 0 :(得分: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>
如果它包含您需要的所有数据,请使用它。
答案 1 :(得分:0)
在Xperf中,您希望查找Hard Faults - 请注意,这是Page Fault的类型,但页面错误通常可以在软件中处理,而不会触及驱动器。您可以在任务管理器中添加一列以显示每个进程的页面错误。
您可以使用https://technet.microsoft.com/en-us/sysinternals/vmmap.aspx之类的工具获取有关进程的一些信息,该工具将告诉您进程地址空间中的每个内存块是什么类型,以及提交了多少。但是,它是可以分页的已提交内存,而VirtualQueryEx()并没有告诉您这一点。
同样值得注意的是,大量的分页记忆并不总是坏事 - 这是一个很慢的硬故障。
编辑:嗯,如果你想要一个侵入式的一次性测试,我想有一个hacky选项,结合VirtualQueryEx()和ReadProcessMemory()来触摸一个进程中的每个已提交的页面,这样你就可以计算硬故障!