パフォーマンス カウンターとインプロセス side-by-side アプリケーション

パフォーマンス モニター (Perfmon.exe) を使用すると、ランタイム単位でパフォーマンス カウンターを区別できます。 このトピックでは、この機能を有効にするために必要なレジストリの変更について説明します。

既定の動作

既定では、パフォーマンス モニターにはアプリケーション単位でパフォーマンス カウンターが表示されます。 ただし、これが問題となる状況が 2 つあります。

  • 同じ名前を持つ 2 つのアプリケーションを監視する場合。 たとえば、どちらのアプリケーションも myapp.exe という名前である場合、[インスタンス] 列には、一方が myapp として、もう一方が myapp#1 として表示されます。 この場合、パフォーマンス カウンターとアプリケーションの対応関係がわかりにくくなります。 myapp#1 について収集されたデータが、最初の myapp.exe のものであるか、2 番目の myapp.exe のものであるかが明確ではありません。

  • 1 つのアプリケーションで、共通言語ランタイムの複数のインスタンスが使用される場合。 .NET Framework Version 4 では、インプロセスでの side-by-side ホスティングのシナリオに対応しています。つまり、1 つのプロセスまたはアプリケーションで、共通言語ランタイムの複数のインスタンスを読み込むことができます。 myapp.exe という名前の 1 つのアプリケーションで 2 つのランタイム インスタンスを読み込む場合、既定では、[インスタンス] 列にそれぞれ myappmyapp#1 として表示されます。 この場合、myappmyapp#1 は、同じ名前を持つ 2 つのアプリケーションを指しているのか、2 つのランタイムを使用する 1 つのアプリケーションを指しているのか明確ではありません。 同じ名前を持つ複数のアプリケーションで複数のランタイムを読み込む場合は、さらにあいまいになります。

レジストリ キーを設定すると、このあいまいさを解消することができます。 .NET Framework 4 を使用して開発されたアプリケーションの場合、このレジストリの変更を行うと、[インスタンス] 列のアプリケーション名にプロセス ID とランタイム インスタンス ID が付加されます。 [インスタンス] 列には、application や application#1 の代わりに、アプリケーションが application_pprocessID_rruntimeID として表示されます。 以前のバージョンの共通言語ランタイムを使用して開発されたアプリケーションの場合は、.NET Framework 4 がインストールされていれば、そのインスタンスが application_pprocessID として表されます。

インプロセス side-by-side アプリケーションのパフォーマンス カウンター

1 つのアプリケーションでホストされる複数の共通言語ランタイム バージョンのパフォーマンス カウンターを設定するには、次の表に示すように、1 つのレジストリ キー設定を変更する必要があります。

キー名

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\.NETFramework\Performance

値の名前

ProcessNameFormat

値の種類

REG_DWORD

1 (0x00000001)

ProcessNameFormat の値が 0 の場合は、既定の動作が有効であることを示します。つまり、Perfmon.exe には、アプリケーション単位でパフォーマンス カウンターが表示されます。 この値を 1 に設定すると、Perfmon.exe では、複数のバージョンのアプリケーションのあいまいさを解消し、ランタイム単位でパフォーマンス カウンターを用意します。 ProcessNameFormat レジストリ キー設定のその他の値は、今後使用するために予約されており、サポートされていません。

ProcessNameFormat レジストリ キー設定を更新したら、インスタンスの名前付け機能を正常に動作させるために、Perfmon.exe またはパフォーマンス カウンターのその他のコンシューマーを再起動する必要があります。

ProcessNameFormat 値をプログラムで変更する方法を次の例に示します。

' Create or open registry key.
Dim key As Microsoft.Win32.RegistryKey 
key = Microsoft.Win32.Registry.LocalMachine.CreateSubKey( _
            "System\CurrentControlSet\Services\.NETFramework\Performance")
' Create or overwrite value.
key.SetValue("ProcessNameFormat", 1, _
             Microsoft.Win32.RegistryValueKind.DWord)
key.Close()             
// Create or open registry key.
Microsoft.Win32.RegistryKey key; 
key = Microsoft.Win32.Registry.LocalMachine.CreateSubKey( 
          @"System\CurrentControlSet\Services\.NETFramework\Performance");
// Create or overwrite value.
key.SetValue("ProcessNameFormat", 1, 
             Microsoft.Win32.RegistryValueKind.DWord);
key.Close();

このレジストリの変更を行うと、Perfmon.exe では、.NET Framework 4 を対象とするアプリケーションの名前が application_pprocessID_rruntimeID として表示されるようになります。ここで、application はアプリケーションの名前、processID はアプリケーションのプロセス ID、runtimeID は共通言語ランタイム ID です。 たとえば、myapp.exe という名前の 1 つのアプリケーションで共通言語ランタイムの 2 つのインスタンスを読み込む場合、Perfmon.exe では、一方のインスタンスが myapp_p1416_r10 として、もう一方が myapp_p3160_r10 として識別されます。 ランタイム ID は、プロセス内のランタイムのあいまいさを解消するだけで、ランタイムに関するその他の情報は提供しません (たとえば、ランタイム ID はランタイムのバージョンや SKU とは関係がありません)。

.NET Framework 4 がインストールされている場合、このレジストリの変更は、以前のバージョンの .NET Framework を使用して開発されたアプリケーションにも適用されます。 これらのアプリケーションは、Perfmon.exe で application_pprocessID として表示されます。ここで、application はアプリケーション名、processID はプロセス ID です。 たとえば、myapp.exe という名前の 2 つのアプリケーションのパフォーマンス カウンターを監視する場合は、一方のアプリケーションが myapp_p23900 として、もう一方が myapp_p24908 として表示されます。

メモメモ

プロセス ID によって、以前のバージョンのランタイムを使用する同じ名前の 2 つのアプリケーションを区別するときのあいまいさが解消されます。以前のバージョンの共通言語ランタイムは side-by-side 実行に対応していないため、ランタイム ID は以前のバージョンには必要ありません。

.NET Framework 4 が存在しないかアンインストールされている場合は、このレジストリ キーを設定しても効果はありません。 その場合、同じ名前を持つ 2 つのアプリケーションは、引き続き Perfmon.exe で application と application#1 (たとえば、myappmyapp#1) として表示されます。