다음을 통해 공유


성능 카운터 및 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에서는 In-Process Side-by-Side 호스팅 시나리오를 지원합니다. 즉, 단일 프로세스 또는 애플리케이션에서 공용 언어 런타임의 인스턴스를 여러 개 로드할 수 있습니다. myapp.exe라는 단일 애플리케이션에서 두 개의 런타임 인스턴스를 로드하는 경우 기본적으로 Instance 열이 myappmyapp#1로 지정됩니다. 이 경우 myappmyapp#1이 이름이 같은 두 애플리케이션을 나타내는지 아니면 런타임이 두 개인 동일한 애플리케이션을 나타내는지 명확하지 않습니다. 이름이 같은 여러 애플리케이션에서 여러 런타임을 로드하는 경우 모호성은 더 커집니다.

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

In-Process Side-by-Side 애플리케이션의 성능 카운터

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

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\.NETFramework\Performance
항목 ProcessNameFormat
Type 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_pprocessID로 표시합니다. 여기서 application은 애플리케이션의 이름이고 processID는 애플리케이션의 프로세스 식별자입니다. 예를 들어 myapp.exe라는 애플리케이션에서 공용 언어 런타임의 인스턴스를 두 개 로드하는 경우 Perfmon.exe에서는 하나의 인스턴스를 myapp_1416으로 식별하고 두 번째는 myapp_3160으로 식별합니다.

참고 항목

프로세스 식별자를 사용하면 이전 버전의 런타임을 사용하는 이름이 동일한 두 애플리케이션을 확인할 때 모호성이 제거됩니다. 이전 버전의 공용 언어 런타임에서는 병렬 시나리오를 지원하지 않으므로 이전 버전에는 런타임 ID가 필요하지 않습니다.

.NET Framework 4 이상 버전이 없거나 설치되지 않은 경우 레지스트리 키를 설정해도 영향을 미치지 않습니다. 즉, 이름이 같은 두 개의 애플리케이션이 Perfmon.exe에 계속 applicationapplication#1(예: myappmyapp#1)로 표시됩니다.