アプリケーション ドメインのリソース監視Application Domain Resource Monitoring

アプリケーション ドメインのリソース監視 (ARM) を使用して、ホストでアプリケーション ドメインによる CPU とメモリの使用状況を監視できます。Application domain resource monitoring (ARM) enables hosts to monitor CPU and memory usage by application domain. これは、実行時間の長いプロセスで多数のアプリケーション ドメインを使用する ASP.NET などのホストに役立ちます。This is useful for hosts such as ASP.NET that use many application domains in a long-running process. 問題のあるアプリケーションを特定できる場合に限り、ホストは、プロセス全体のパフォーマンスに悪影響を与えるアプリケーションのアプリケーション ドメインをアンロードできます。The host can unload the application domain of an application that is adversely affecting the performance of the entire process, but only if it can identify the problematic application. ARM は、このような意思決定を支援するために使用できる情報を提供します。ARM provides information that can be used to assist in making such decisions.

たとえば、ホスティング サービスでは、ASP.NET サーバー上で多くのアプリケーションが実行されている可能性があります。For example, a hosting service might have many applications running on an ASP.NET server. プロセス内の 1 つのアプリケーションでメモリ消費量やプロセッサ時間が過度に増え始めた場合、ホスティング サービスは ARM を使用して問題の原因となっているアプリケーション ドメインを特定できます。If one application in the process begins consuming too much memory or too much processor time, the hosting service can use ARM to identify the application domain that is causing the problem.

ARM は十分に軽量なので、ライブ アプリケーションで使用できます。ARM is sufficiently lightweight to use in live applications. 情報には、Windows (ETW) のイベント トレースを使用してアクセスするか、マネージド API またはネイティブ API を使用して直接アクセスできます。You can access the information by using event tracing for Windows (ETW) or directly through managed or native APIs.

リソース監視を有効にするEnabling Resource Monitoring

ARM を有効にする方法は 4 つあります。共通言語ランタイム (CLR) の起動時に構成ファイルを提供する方法、アンマネージド ホスティング API を使用する方法、マネージド コードを使用する方法、または ARM ETW イベントをリッスンする方法です。ARM can be enabled in four ways: by supplying a configuration file when the common language runtime (CLR) is started, by using an unmanaged hosting API, by using managed code, or by listening to ARM ETW events.

ARM が有効になるとすぐに、プロセスのすべてのアプリケーション ドメイン上でデータの収集が開始されます。ARM が有効になる前にアプリケーション ドメインが作成された場合、アプリケーション ドメインの作成時ではなく、ARM が有効になったときに累積データが開始されます。ARM を有効にした後に無効にすることはできません。As soon as ARM is enabled, it begins collecting data on all application domains in the process.If an application domain was created before ARM is enabled, cumulative data starts when ARM is enabled, not when the application domain was created.Once it is enabled, ARM cannot be disabled.

  • CLR 起動時に ARM を有効にするには、<appDomainResourceMonitoring> 要素を構成ファイルに追加し、enabled 属性を true に設定します。You can enable ARM at CLR startup by adding the <appDomainResourceMonitoring> element to the configuration file, and setting the enabled attribute to true. false の値 (既定) は、起動時に ARM は有効ではないことのみを意味します。他のアクティブ化メカニズムのいずれかを使用して、後で有効にすることができます。A value of false (the default) means only that ARM is not enabled at startup; you can activate it later by using one of the other activation mechanisms.

  • ホストは、ICLRAppDomainResourceMonitor ホスティング インターフェイスを要求することで ARM を有効にすることができます。The host can enable ARM by requesting the ICLRAppDomainResourceMonitor hosting interface. このインターフェイスが正常に取得されると、ARM が有効になります。Once this interface is successfully obtained, ARM is enabled.

  • マネージド コードでは、static (Visual Basic では Shared) AppDomain.MonitoringIsEnabled プロパティを true に設定して ARM を有効にすることができます。Managed code can enable ARM by setting the static (Shared in Visual Basic) AppDomain.MonitoringIsEnabled property to true. プロパティが設定されるとすぐに、ARM が有効になります。As soon as the property is set, ARM is enabled.

  • 起動後に ETW イベントをリッスンして ARM を有効にすることができます。You can enable ARM after startup by listening to ETW events. AppDomainResourceManagementKeyword キーワードを使用してパブリック プロバイダー Microsoft-Windows-DotNETRuntime を有効にすると、ARM が有効になり、すべてのアプリケーション ドメインのイベント生成が開始されます。ARM is enabled and begins raising events for all application domains when you enable the public provider Microsoft-Windows-DotNETRuntime by using the AppDomainResourceManagementKeyword keyword. データをアプリケーション ドメインとスレッドに関連付けるには、ThreadingKeyword キーワードを使用して Microsoft-Windows-DotNETRuntimeRundown プロバイダーを有効にする操作も必要です。To correlate data with application domains and threads, you must also enable the Microsoft-Windows-DotNETRuntimeRundown provider with the ThreadingKeyword keyword.

ARM の使用Using ARM

ARM は、アプリケーション ドメインに使用される合計プロセッサ時間と、メモリ使用に関する 3 種類の情報を提供します。ARM provides the total processor time that is used by an application domain and three kinds of information about memory use.

  • アプリケーション ドメインの合計プロセッサ時間 (秒単位): アプリケーション ドメインの有効期間中に実行されていたすべてのスレッドについて、オペレーティング システムから報告されたスレッド時間を合計して計算されます。Total processor time for an application domain, in seconds: This is calculated by adding up the thread times reported by the operating system for all threads that spent time executing in the application domain during its lifetime. ブロックされているスレッドまたはスリープ状態のスレッドは、プロセッサ時間を使用しません。Blocked or sleeping threads do not use processor time. スレッドがネイティブ コードを呼び出すときに、スレッドがネイティブ コードに費やす時間は、呼び出しが行われたアプリケーション ドメインの計算に含まれます。When a thread calls into native code, the time that the thread spends in native code is included in the count for the application domain where the call was made.

  • 有効期間中にアプリケーション ドメインによって行われたマネージドされた割り当ての合計 (バイト単位): 割り当てられたオブジェクトの有効期間は短いことがあるので、割り当ての合計にアプリケーション ドメインによるメモリ使用量が反映されない場合もあります。Total managed allocations made by an application domain during its lifetime, in bytes: Total allocations do not always reflect memory use by an application domain, because the allocated objects might be short-lived. ただし、アプリケーションが膨大な数のオブジェクトを割り当ててから解放すると、割り当てのコストが大幅に高くなる可能性があります。However, if an application allocates and frees huge numbers of objects, the cost of the allocations could be significant.

  • アプリケーション ドメインによって参照され、最新の完全なブロッキング コレクションの後に残っているマネージド メモリ (バイト単位): この数値は完全なブロッキング コレクションの後にのみ正確になります。Managed memory, in bytes, that is referenced by an application domain and that survived the most recent full, blocking collection: This number is accurate only after a full, blocking collection. (これは、バックグラウンドで発生し、アプリケーションをブロックしない同時コレクションとは対照的です)。たとえば、GC.Collect() メソッドのオーバーロードによって、完全なブロッキング コレクションが実行されます。(This is in contrast to concurrent collections, which occur in the background and do not block the application.) For example, the GC.Collect() method overload causes a full, blocking collection.

  • プロセスによって参照され、最新の完全なブロッキング コレクションの後に残っている合計マネージド メモリ (バイト単位): 個々のアプリケーション ドメインに残っている​​メモリをこの数値と比較できます。Total managed memory, in bytes, that is referenced by the process and that survived the most recent full, blocking collection: The survived memory for individual application domains can be compared to this number.

完全なブロッキング コレクションが発生したときの判断Determining When a Full, Blocking Collection Occurs

残っているメモリの計算が正確かどうかを判断するには、完全なブロッキング コレクションがいつ発生したかを把握する必要があります。To determine when counts of survived memory are accurate, you need to know when a full, blocking collection has just occurred. これを行う方法は、ARM 統計を調べるために使用する API によって異なります。The method for doing this depends on the API you use to examine ARM statistics.

マネージド APIManaged API

AppDomain クラスのプロパティを使用する場合は、GC.RegisterForFullGCNotification メソッドを使用して完全なコレクションの通知を登録できます。If you use the properties of the AppDomain class, you can use the GC.RegisterForFullGCNotification method to register for notification of full collections. コレクションのアプローチではなく、コレクションの完了を待機するので、使用するしきい値は重要ではありません。The threshold you use is not important, because you are waiting for the completion of a collection rather than the approach of a collection. 次に、GC.WaitForFullGCComplete メソッドを呼び出すことができます。このメソッドは、完全なコレクションが完了するまでブロックされます。You can then call the GC.WaitForFullGCComplete method, which blocks until a full collection has completed. ループ内でメソッドを呼び出し、メソッドから復帰するたびに必要な分析を実行するスレッドを作成できます。You can create a thread that calls the method in a loop and does any necessary analysis whenever the method returns.

また、GC.CollectionCount メソッドを定期的に呼び出して、世代 2 コレクションの数が増加しているかどうかを確認することもできます。Alternatively, you can call the GC.CollectionCount method periodically to see if the count of generation 2 collections has increased. ポーリング頻度によっては、この手法では完全なコレクションの発生が正確に示されない場合があります。Depending on the polling frequency, this technique might not provide as accurate an indication of the occurrence of a full collection.

ホスティング APIHosting API

アンマネージ ホスティング API を使用する場合、ホストは CLR に IHostGCManager インターフェイスの実装を渡す必要があります。If you use the unmanaged hosting API, your host must pass the CLR an implementation of the IHostGCManager interface. コレクションの実行中に中断されたスレッドの実行を再開すると、CLR は IHostGCManager::SuspensionEnding メソッドを呼び出します。The CLR calls the IHostGCManager::SuspensionEnding method when it resumes execution of threads that have been suspended while a collection occurs. CLR は、完全なコレクションの生成をメソッドのパラメーターとして渡します。そのため、ホストはコレクションが完全か部分的かを判断できます。The CLR passes the generation of the completed collection as a parameter of the method, so the host can determine whether the collection was full or partial. IHostGCManager::SuspensionEnding メソッドを実装すると、残っているメモリのクエリを実行して、カウントが更新された場合にすぐに取得することができます。Your implementation of the IHostGCManager::SuspensionEnding method can query for survived memory, to ensure that the counts are retrieved as soon as they are updated.

関連項目See also