4

是否有一个性能计数器来指示特定进程的多少内存被调出?我有一台具有 40 GB 可用 RAM(128 GB 物理内存)的服务器,但分页的数据量超过 100 GB。我怎样才能找出我的哪些进程负责那个巨大的页面文件消耗?

也可以进行一些 xperf 跟踪以查看页面输出活动何时发生。但是除了对页面文件的许多写入之外,我看不到内存是从哪个进程写入页面文件的。

参考集跟踪仅向我展示了我的进程的物理内存消耗有多大。但它似乎没有跟踪页面输出活动。

更新 操作系统是 Windows Server 2012 R2

4

2 回答 2

2

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>

如果它包含您需要的所有数据,请使用它。

于 2016-07-19T15:41:42.590 回答
0

在 Xperf 中,您想要查找Hard Faults - 请注意,这是一种Page Fault,但通常可以在软件中处理页面错误而无需接触驱动器。您可以在任务管理器中添加一列以显示每个进程的页面错误。

您可以使用https://technet.microsoft.com/en-us/sysinternals/vmmap.aspx之类的工具获取有关进程的一些信息,该工具会告诉您进程地址空间中的每个内存块是什么类型,以及承诺的金额。但是,可以调出的是已提交的内存,而VirtualQueryEx()并没有告诉您这一点。

还值得注意的是,大量的分页内存并不总是一件坏事——速度很慢的是硬故障。

编辑:嗯,如果你想要一个侵入性的一次性测试,我想有一个组合 VirtualQueryEx() 和 ReadProcessMemory() 来触摸进程中每个提交的页面的hacky选项,这样你就可以计算硬故障!

于 2016-07-04T23:00:38.583 回答