WCF パフォーマンス カウンタ
Windows Communication Foundation (WCF) には、アプリケーションのパフォーマンス測定に役立つ多数のパフォーマンス カウンタが備わっています。
パフォーマンス カウンタの有効化
次のように、WCF サービスの app.config 構成ファイルを使用して WCF サービスのパフォーマンス カウンタを有効にできます。
<configuration>
<system.serviceModel>
<diagnostics performanceCounters="All" />
</system.serviceModel>
</configuration>
特定の種類のパフォーマンス カウンタを有効にするよう performanceCounters 属性を設定できます。有効な値は次のとおりです。
- All : すべてのカテゴリ カウンタ (ServiceModelService、ServiceModelEndpoint、ServiceModelOperation) を有効にします。
- ServiceOnly : ServiceModelService カテゴリ カウンタのみを有効にします。
- Off : ServiceModel* パフォーマンス カウンタを無効にします。これが既定値です。
すべての WCF アプリケーションのパフォーマンス カウンタを有効にする場合は、構成設定を Machine.config ファイルに配置します。コンピュータのパフォーマンス カウンタ用に十分なメモリを構成する方法については、「パフォーマンス カウンタのメモリ サイズの増加」セクションを参照してください。
また次のように、コード内でパフォーマンス カウンタを有効にすることもできます。
using System.Configuration;
using System.ServiceModel.Configuration;
using System.ServiceModel.Diagnostics;
Configuration config = ConfigurationManager.OpenExeConfiguration(
ConfigurationUserLevel.None);
ServiceModelSectionGroup sg = ServiceModelSectionGroup.GetSectionGroup(config);
sg.Diagnostic.PerformanceCounters = PerformanceCounterScope.All;
config.Save();
パフォーマンス データの表示
Windows に付属のパフォーマンス モニタ (Perfmon.exe) を使用して、パフォーマンス カウンタによりキャプチャされたデータを表示できます。このツールを起動するには、[スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックして、ダイアログ ボックスに「perfmon.exe」と入力します****。
メモ : |
---|
エンドポイント ディスパッチャによって最後のメッセージが処理される前に、パフォーマンス カウンタ インスタンスが解放される場合があります。その結果、パフォーマンス データに一部のメッセージがキャプチャされない可能性があります。 |
パフォーマンス カウンタのメモリ サイズの増加
WCF は、パフォーマンス カウンタ カテゴリごとに別々の共有メモリを使用します。
既定では、個々の共有メモリは、グローバル パフォーマンス カウンタのメモリ サイズの 4 分の 1 に設定されます。グローバル パフォーマンス カウンタのメモリの既定値は 524,288 バイトです。したがって、WCF の 3 つのパフォーマンス カウンタ カテゴリの既定サイズは、それぞれ約 128 KB になります。コンピュータ上での WCF アプリケーションの実行時特性によっては、パフォーマンス カウンタ メモリが足りなくなる場合があります。メモリ不足が発生すると、WCF により、そのアプリケーションのイベント ログにエラーが書き込まれます。エラーの内容にはパフォーマンス カウンタが読み込まれなかったことが示され、エントリには、"System.InvalidOperationException: カスタム カウンタ ファイル ビューのメモリが足りません" という例外が含まれます。このエラー レベルでトレースが有効になっている場合は、さらにこの障害がトレースされます。パフォーマンス カウンタのメモリがなくなった場合、パフォーマンス カウンタを有効にして WCF アプリケーションを続行するとパフォーマンスが低下する可能性があります。コンピュータの管理者は、使用可能なすべてのパフォーマンス カウンタをいつでも読み込めるだけの十分なメモリを割り当てておく必要があります。詳細については、「performanceCounters」を参照してください。
レジストリで WCF カテゴリごとにパフォーマンス カウンタ メモリの量を変更できます。これを行うには、次の 3 つの場所に FileMappingSize
という名前の新しい DWORD 値を追加し、目的の値をバイト単位で設定します。コンピュータを再起動すると、設定した値が有効になります。
- HKLM\System\CurrentControlSet\Services\ServiceModelEndpoint 3.0.0.0\Performance
- HKLM\System\CurrentControlSet\Services\ServiceModelOperation 3.0.0.0\Performance
- HKLM\System\CurrentControlSet\Services\ServiceModelService 3.0.0.0\Performance
膨大な数のオブジェクト (ServiceHost など) が破棄され、ガベージ コレクトされるまで待機している場合、PrivateBytes パフォーマンス カウンタには非常に高い数値が登録されます。この問題を解決するには、アプリケーション固有の独自のカウンタを追加するか、performanceCounters 属性を使用してサービス レベルのカウンタだけを有効にします。
パフォーマンス カウンタの種類
パフォーマンス カウンタには、サービス、エンドポイント、操作の 3 つのレベルがあります。
WMI を使用してパフォーマンス カウンタのインスタンス名を取得できます。コード例を次に示します。
- サービス カウンタのインスタンス名は、WMI サービス インスタンスの "CounterInstanceName" プロパティを使用して取得できます。
- エンドポイント カウンタのインスタンス名は、WMI エンドポイント インスタンスの "CounterInstanceName" プロパティを使用して取得できます。
- 操作カウンタのインスタンス名は、WMI エンドポイント インスタンスの "GetOperationCounterInstanceName" メソッドを使用して取得できます。
WMI の詳細については、「診断用の WMI (Windows Management Instrumentation) の使用」を参照してください。
サービスのパフォーマンス カウンタ
サービスのパフォーマンス カウンタはサービス動作全体を測定し、サービス全体のパフォーマンスを診断するために使用できます。パフォーマンス モニタを使用して表示する場合、これらのカウンタは、ServiceModelService 3.0.0.0 パフォーマンス オブジェクトの下にあります。インスタンスには次のパターンの名前が付けられています。
ServiceName@ServiceBaseAddress
サービス スコープ内のカウンタは、エンドポイントのコレクションのカウンタが集計されています。
サービス インスタンス作成のパフォーマンス カウンタは、新しい InstanceContext が作成されるとインクリメントされます。新しい InstanceContext は、非アクティブ化メッセージを (既存のサービスで) 受信した場合でも、あるセッションからインスタンスに接続し、セッションを終了後に別のセッションから再接続した場合でも作成されることに注意してください。
エンドポイントのパフォーマンス カウンタ
エンドポイントのパフォーマンス カウンタにより、エンドポイントでのメッセージの受信状況を表すデータを参照できます。パフォーマンス モニタを使用して表示する場合、これらのカウンタは、ServiceModelEndpoint 3.0.0.0 パフォーマンス オブジェクトの下にあります。インスタンスには次のパターンの名前が付けられています。
(ServiceName).(ContractName)@(endpoint listener address)
このデータは、個々の操作で収集されるデータに似ていますが、エンドポイントから集計されただけのデータです。
エンドポイント スコープ内のカウンタは、操作のコレクションのカウンタから集計されます。
メモ : |
---|
コントラクト名とアドレスが同一の 2 つのエンドポイントは、同じカウンタ インスタンスにマップされます。 |
操作のパフォーマンス カウンタ
パフォーマンス モニタを使用して表示する場合、操作パフォーマンス カウンタは、ServiceModelOperation 3.0.0.0 パフォーマンス オブジェクトの下にあります。それぞれの操作に個別のインスタンスがあります。つまり、指定したコントラクトに 10 の操作がある場合、10 の操作カウンタ インスタンスがそのコントラクトに関連付けられます。オブジェクトのインスタンスには次のパターンの名前が付いています。
(ServiceName).(ContractName).(OperationName)@(first endpoint listener address)
このカウンタにより呼び出しがどのように使用されている、操作がどれほど効率的に実行されているかを調べることができます。
カウンタが複数のスコープで表示される場合、上位のスコープで収集されたデータは、下位のスコープからのデータが集計されています。たとえば、エンドポイントの Calls は、エンドポイント内のすべての操作呼び出しの合計を表します。サービスの Calls は、サービス内のすべての操作呼び出しの合計を表します。
メモ : |
---|
1 つのコントラクトに重複した操作名がある場合は、その両方の操作に対してカウンタ インスタンスは 1 つだけ取得されます。 |
WCF パフォーマンス カウンタのプログラミング
プログラムで WCF パフォーマンス カウンタにアクセスできるよう SDK インストール フォルダにはいくつかのファイルがインストールされています。そのファイルを次に示します。
- _ServiceModelEndpointPerfCounters.vrg
- _ServiceModelOperationPerfCounters.vrg
- _ServiceModelServicePerfCounters.vrg
- _SMSvcHostPerfCounters.vrg
- _TransactionBridgePerfCounters.vrg
プログラムでカウンタにアクセスする方法の詳細ついては、「パフォーマンス カウンタのプログラミング アーキテクチャ」を参照してください。