4

特定のプロセスのページ アウトされたメモリの量を示すパフォーマンス カウンターはありますか? 使用可能な RAM が 40 GB (128 GB の物理メモリ) のサーバーがありますが、ページ アウトされたデータの量は 100 GB を超えています。ヒュージ ページ ファイルの消費の原因となっているプロセスを特定するにはどうすればよいですか?

また、ページ アウト アクティビティがいつ発生するかを確認するために、xperf トレースを使用することもできます。しかし、ページ ファイルへの多くの書き込みは別として、どのプロセスからメモリがページ ファイルに書き込まれたかを確認できません。

参照セットのトレースは、プロセスの物理メモリ消費量がどれだけ大きいかを理解している範囲でしか示していません。しかし、ページ アウト アクティビティを追跡していないようです。

更新 OS は 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 ではハード フォールトを探します。これはPage Faultの一種ですが、多くの場合、ページ フォールトはドライブに触れずにソフトウェアで処理できます。タスク マネージャーに列を追加して、各プロセスのページ フォールトを表示できます。

https://technet.microsoft.com/en-us/sysinternals/vmmap.aspxのようなツールを使用して、プロセスに関する情報を取得できます。これにより、プロセス アドレス空間内のメモリ ブロックごとに、そのタイプが何であるかがわかります。 、およびコミットされた量。ただし、ページアウトできるのはコミットされたメモリであり、VirtualQueryEx()はそれについて教えてくれません。

また、大量のページ アウト メモリが必ずしも悪いことではないことにも注意してください。遅いのはハード フォールトです。

編集: うーん、侵入型の 1 回限りのテストが必要な場合は、VirtualQueryEx() と ReadProcessMemory() を組み合わせて、プロセス内のコミットされたすべてのページに触れるというハックなオプションがあると思います。これにより、ハード フォールトをカウントできます。

于 2016-07-04T23:00:38.583 に答える