注
この記事は .NET Framework に固有のものです。 .NET 6 以降のバージョンを含む、.NET の新しい実装には適用されません。
パフォーマンス モニター (Perfmon.exe) を使用すると、パフォーマンス カウンターをランタイムごとに区別できます。 このトピックでは、この機能を有効にするために必要なレジストリの変更について説明します。
既定の動作
既定では、パフォーマンス モニターには、アプリケーションごとにパフォーマンス カウンターが表示されます。 ただし、次の 2 つのシナリオで問題が発生します。
同じ名前の 2 つのアプリケーションを監視する場合。 たとえば、両方のアプリケーションの名前が myapp.exeの場合、1 つは myapp として表示され、もう 1 つは [インスタンス] 列に myapp#1 として表示されます。 この場合、パフォーマンス カウンターを特定のアプリケーションに一致させるのは困難です。 myapp#1 用に収集されたデータが最初の myapp.exe を参照しているか、2 番目の myapp.exeを参照しているのかは明らかではありません。
アプリケーションが共通言語ランタイムの複数のインスタンスを使用する場合。 .NET Framework 4 では、インプロセスのサイド バイ サイド ホスティング シナリオがサポートされています。つまり、1 つのプロセスまたはアプリケーションが共通言語ランタイムの複数のインスタンスを読み込むことができます。 myapp.exe という名前の 1 つのアプリケーションが 2 つのランタイム インスタンスを読み込む場合、既定では、 インスタンス列にmyapp と myapp#1 として指定されます。 この場合、 myapp と myapp#1 が同じ名前の 2 つのアプリケーションを参照しているか、2 つのランタイムを持つ同じアプリケーションを参照しているのかは明確ではありません。 同じ名前の複数のアプリケーションが複数のランタイムを読み込む場合、あいまいさがさらに大きくなります。
レジストリ キーを設定して、このあいまいさを排除できます。 .NET Framework 4 を使用して開発されたアプリケーションの場合、このレジストリの変更により、プロセス識別子の後にランタイム インスタンス識別子が インスタンス列の アプリケーション名に追加されます。
アプリケーションまたはアプリケーション #1 の代わりに、アプリケーションはインスタンス列の application_p
processID_r
runtimeID として識別されるようになりました。 アプリケーションが以前のバージョンの共通言語ランタイムを使用して開発された場合、.NET Framework 4 がインストールされている場合、そのインスタンスは application_p
processID として表されます。
In-Process side-by-side アプリケーションのパフォーマンス カウンター
1 つのアプリケーションでホストされている複数の共通言語ランタイム バージョンのパフォーマンス カウンターを処理するには、次の表に示すように、1 つのレジストリ キー設定を変更する必要があります。
価値 | |
---|---|
鍵 | HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\.NETFramework\Performance |
エントリ | ProcessNameFormat |
タイプ | REG_DWORD |
価値 | 2 (0x00000002) |
ProcessNameFormat
の値 0 は、既定の動作が有効になっていることを示します。つまり、Perfmon.exe は、アプリケーションごとにパフォーマンス カウンターを表示します。 この値を 2 に設定すると、アプリケーションの複数のバージョン Perfmon.exe あいまいさが解消され、ランタイムごとにパフォーマンス カウンターが提供されます。
ProcessNameFormat
レジストリ キー設定のその他の値はサポートされておらず、将来使用するために予約されています。
ProcessNameFormat
レジストリ キーの設定を更新した後、新しいインスタンスの名前付け機能が正しく機能するように、Perfmon.exe またはその他のパフォーマンス カウンターのコンシューマーを再起動する必要があります。
次の例は、 ProcessNameFormat
値をプログラムで変更する方法を示しています。
// 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();
' 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()
このレジストリを変更し、.NET Framework 4 以降がインストールされている場合、Perfmon.exe アプリケーションの名前が application_p
processID として表示されます 。アプリケーションは アプリケーションの名前で、 processID はアプリケーションのプロセス識別子です。 たとえば、myapp.exe という名前のアプリケーションが共通言語ランタイムの 2 つのインスタンスを読み込む場合、Perfmon.exe は 1 つのインスタンスをmyapp_1416として、もう 1 つのインスタンスをmyapp_3160として識別できます。
注
プロセス識別子は、以前のバージョンのランタイムを使用する同じ名前の 2 つのアプリケーションを解決するあいまいさを排除します。 以前のバージョンの共通言語ランタイムではサイド バイ サイド シナリオがサポートされていないため、ランタイム識別子は以前のバージョンでは必要ありません。
.NET Framework 4 以降のバージョンが存在しないか、アンインストールされた場合、レジストリ キーの設定は無効です。 つまり、同じ名前の 2 つのアプリケーションは、アプリケーションとアプリケーション #1 (たとえば、myapp と myapp#1) として Perfmon.exe に引き続き表示されます。
.NET