Managed GC Aware Dump を使用してメモリ ダンプを収集する方法


導入

プロセス メモリ ダンプは、Web サイトのトラブルシューティングに使用される、大変有効な情報源です。そのため、Sitecoreサポートからも頻繁にお客様に収集を依頼しています。

このため、ユーザー リクエストに基づいて(オンデマンド)、または特定のイベントに基づいて(条件付き)、プロセスのメモリ ダンプを収集するためのツールがいくつかあります。

当KB記事では、Managed GC Aware Dumpアプリケーションを使用したメモリ ダンプの収集方法をご説明します。

その他の方法でのメモリ ダンプの収集方法は、以下の記事をご参照ください。

ツールの概要とダウンロード リンク

Managed GC Aware Dumpツールは、オンデマンド、または特定世代の領域に対するガベージ コレクション(GC)直前のメモリ ダンプを収集することができるフリーのコマンドライン ツールです。

他のメモリ ダンプ収集ツールとこのツールの間の最大の違いは、ガベージ コレクション発生時のダンプを収集できる点です。そのため、収集されたファイルからの.NETメモリ ヒープの分析を実現できます。

このツールは、次のリンクからダウンロードできます:ManagedGcAwareDump.zip

.NETのガベージ コレクションにつきましては、以下の記事をご参照ください。
https://learn.microsoft.com/ja-jp/dotnet/standard/garbage-collection/
https://learn.microsoft.com/ja-jp/dotnet/standard/garbage-collection/fundamentals

メモリ ダンプ ファイルの収集 -  オンデマンド

任意の時点におけるプロセスのメモリ ダンプを収集するには、以下のようにManaged GC Aware Dumpツールを実行します。

ManagedGcAwareDump_x64.exe [Name or PID]

註:
対象のプロセスのバイト数に応じ、適当なツール(ManagedGcAwareDump_x64.exeまたはManagedGcAwareDump_x86.exe)を選択する必要があります。

註:
パラメーターには、[Name or PID]の文字列ではなく、対象のプロセスを特定するためのプロセス名、またはプロセスIDを設定する必要があります。

プロセス名は、プロセスが一意の名前を持つとき(例えば、IIS 6以降のバージョンのIISの場合、w3wp.exeなど)に使用できます。

複数のw3wp.exeが存在する場合は、プロセスIDを指定します。SitecoreインスタンスのプロセスIDの特定方法につきましては、以下のKB記事をご参照ください。
実行中のSitecore インスタンスのプロセスIDを特定する方法

メモリ ダンプ ファイルの収集 -  GCとオンデマンド

場合により、フル ガベージ コレクションを実行した後にメモリ ダンプ ファイルを収集することが有効な場合があります。ガベージ コレクションにより、使用中のオブジェクトのみが残るため、メモリ ヒープの分析が容易になります。これは高メモリ使用量の調査時に特に有効です。

1. フル ガベージ コレクションを実行し、メモリ ダンプ ファイルを収集する

[自動モード]

Managed GC Aware Dumpツールを使用することで、GCを自動で実行し、GCの完了後にメモリ ダンプ ファイルを収集することができます。以下のように、パラメーター「/fgc」を付与し、ツールを実行してください。

ManagedGcAwareDump_x64.exe /fgc [Name or PID]
ManagedGcAwareDump_x86.exe /fgc [Name or PID]

註:
この機能には必須要件があり、以下の条件を満たす場合のみ使用できます。


[手動モード]

ご使用中の.NETバージョンが4.0より前のものである場合や、.NET or Visual C++ Redistributableパッケージがインストールされていない場合、手動で以下の手順を実行する必要があります。

  1. GCTrigger.zipをダウンロードし、解凍します
  2. 「GCTrigger.aspx」ファイルをコピーし、「/Website」フォルダーに配置します
  3. ProcDump ツールを特定の例外発生時にダンプファイルを収集するように設定します。
    「特定の初回例外に基づいてメモリダンプ ファイルを収集する」の手順(KB1000546)を使用し、 「OnGCEndException」例外タイプを指定してください。
  4. Web ブラウザから、手順2のページ(http://hostName/GCTrigger.aspx)を開き、「Force GC」ボタンを押下します。

GC終了後、ProcDumpツールがメモリ ダンプ ファイルを収集します。

2. フル ガベージ コレクションを実行、ファイナライザーの実行を待ち、メモリ ダンプ ファイルを収集する

シナリオ1と同じ手順を使用しますが、以下のように調整を加えます。

[自動モード] 

ツール実行時、以下のようにパラメーター「/fgc /wpf」を指定します。

ManagedGcAwareDump_x64.exe /fgc /wpf [Name or PID]
ManagedGcAwareDump_x86.exe /fgc /wpf [Name or PID]

[手動モード]

「GCTrigger.aspx」ページで、「Force GC and wait for pending finalizers」を押下します。

メモリ ダンプ ファイルの収集 - 世代別(GEN)ガベージ コレクション時

ある種の状況では、特定世代のヒープのガベージ コレクションの前に、1つ、もしくは複数のダンプ ファイルを収集すると便利なことがあります。これは、例えば頻繁にGCが発生したり、GCによる高負荷が発生している際の調査に役立つ場合があります。

註:この機能は、アプリケーションが.NET 4.0以降のバージョンの場合のみ使用できます。

1. 特定世代のヒープのGC前にメモリ ダンプを収集する

特定世代のヒープのGC前にメモリ ダンプを収集するには、以下のように、パラメーター「/g[Gen]」を付与し、ツールを実行してください([Gen]には、世代数(0,1,2)を設定します)。

ManagedGcAwareDump_x64.exe /g[Gen] [Name or PID]
ManagedGcAwareDump_x86.exe /g[Gen] [Name or PID]

2. 特定世代のヒープのGC前に複数のメモリ ダンプを収集する

特定世代のヒープのGC前に複数のメモリ ダンプを収集する(1回のGC毎に1つのメモリ ダンプ)には 、以下のように、パラメーター「"/g[Gen]:[N]」を付与し、ツールを実行してください([Gen]には、世代数(0,1,2)を、[N]には収集するメモリ ダンプ数を設定します)。

ManagedGcAwareDump_x64.exe /g[Gen]:[N] [Name or PID]
ManagedGcAwareDump_x86.exe /g[Gen]:[N] [Name or PID]

例:第二世代GC前に3つのメモリ ダンプを収集する場合

ManagedGcAwareDump_x64.exe /g2:3 [Name or PID]