다음을 통해 공유


성능 지표 및 In-Process Side-By-Side 애플리케이션

비고

이 문서는 .NET Framework에만 적용됩니다. .NET 6 이상 버전을 포함하여 .NET의 최신 구현에는 적용되지 않습니다.

성능 모니터(Perfmon.exe)를 사용하면 런타임별로 성능 카운터를 구분할 수 있습니다. 이 항목에서는 이 기능을 사용하도록 설정하는 데 필요한 레지스트리 변경에 대해 설명합니다.

기본 동작

기본적으로 성능 모니터는 애플리케이션별로 성능 카운터를 표시합니다. 그러나 문제가 되는 두 가지 시나리오가 있습니다.

  • 이름이 같은 두 애플리케이션을 모니터링하는 경우 예를 들어 두 애플리케이션의 이름이 myapp.exe경우 하나는 myapp으로, 다른 애플리케이션은 인스턴스 열에 myapp#1로 표시됩니다. 이 경우 성능 카운터를 특정 애플리케이션과 일치하기 어렵습니다. myapp#1에 대해 수집된 데이터가 첫 번째 myapp.exe 참조하는지 아니면 두 번째 myapp.exe참조하는지는 명확하지 않습니다.

  • 애플리케이션이 공용 언어 런타임의 여러 인스턴스를 사용하는 경우 .NET Framework 4는 프로세스 내 병렬 호스팅 시나리오를 지원합니다. 즉, 단일 프로세스 또는 애플리케이션은 공용 언어 런타임의 여러 인스턴스를 로드할 수 있습니다. myapp.exe라는 단일 애플리케이션이 기본적으로 두 개의 런타임 인스턴스를 로드하는 경우 인스턴스 열에서 myappmyapp#1로 지정됩니다. 이 경우 myappmyapp#1 이 이름이 같은 두 애플리케이션을 참조하는지 아니면 두 개의 런타임이 있는 동일한 애플리케이션을 참조하는지 명확하지 않습니다. 이름이 같은 여러 애플리케이션이 여러 런타임을 로드하는 경우 모호성이 훨씬 더 큽니다.

레지스트리 키를 설정하여 이 모호성을 제거할 수 있습니다. .NET Framework 4를 사용하여 개발된 애플리케이션의 경우 이 레지스트리 변경은 프로세스 식별자 뒤에 런타임 인스턴스 식별자를 인스턴스 열의 애플리케이션 이름에 추가합니다. 애플리케이션 또는 application#1 대신 애플리케이션이 인스턴스 열에서p_r_runtimeID로 식별됩니다. 이전 버전의 공용 언어 런타임을 사용하여 애플리케이션을 개발한 경우 .NET Framework 4가 설치된 경우 해당 인스턴스는 application_pprocessID 로 표시됩니다.

In-Process 병렬 애플리케이션에 대한 성능 카운터

단일 애플리케이션에서 호스트되는 여러 공용 언어 런타임 버전에 대한 성능 카운터를 처리하려면 다음 표와 같이 단일 레지스트리 키 설정을 변경해야 합니다.

가치
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\.NETFramework\Performance
항목 프로세스이름형식
유형 프로그램 레지스트리 데이터 타입인 REG_DWORD
2(0x00000002)

값이 0 ProcessNameFormat 이면 기본 동작이 사용하도록 설정되어 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_pprocessID로 표시합니다. 여기서 애플리케이션 은 애플리케이션의 이름이고 processID 는 애플리케이션의 프로세스 식별자입니다. 예를 들어 myapp.exe 애플리케이션이 공용 언어 런타임의 두 인스턴스를 로드하는 경우 Perfmon.exe 한 인스턴스를 myapp_1416, 두 번째 인스턴스를 myapp_3160 식별할 수 있습니다.

비고

프로세스 ID는 이전 버전의 런타임을 사용하는 동일한 이름의 두 응용 프로그램을 구별하는 문제의 모호성을 제거합니다. 이전 버전의 공용 언어 런타임은 병렬 시나리오를 지원하지 않으므로 이전 버전에는 런타임 식별자가 필요하지 않습니다.

.NET Framework 4 이상 버전이 없거나 제거된 경우 레지스트리 키를 설정해도 효과가 없습니다. 즉, 이름이 같은 두 애플리케이션이 애플리케이션 및애플리케이션#1 (예: myappmyapp#1)으로 Perfmon.exe 계속 표시됩니다.