Share via


성능 카운터 및 In-Process Side-By-Side 응용 프로그램

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

기본 동작

기본적으로 성능 모니터는 응용 프로그램별로 성능 카운터를 표시합니다. 그러나 다음과 같은 두 가지 시나리오에서는 이로 인해 문제가 발생합니다.

  • 이름이 같은 두 개의 응용 프로그램을 모니터링하는 경우. 예를 들어, 두 응용 프로그램의 이름이 myapp.exe이면 인스턴스 열에 한 응용 프로그램은 myapp로 표시되고 다른 한 응용 프로그램은 myapp#1로 표시됩니다. 이 경우 성능 카운터와 응용 프로그램을 일치시키기가 어렵습니다. 즉, myapp#1에 대해 수집된 데이터가 첫 번째 myapp.exe에 대한 것인지 아니면 두 번째 myapp.exe에 대한 것인지 명확하지 않습니다.

  • 응용 프로그램에서 여러 개의 공용 언어 런타임 인스턴스를 사용하는 경우. .NET Framework 버전 4에서는 In-Process Side-By-Side 호스팅 시나리오를 지원합니다. 즉, 하나의 프로세스나 응용 프로그램에서 여러 개의 공용 언어 런타임 인스턴스를 로드할 수 있습니다. myapp.exe라는 이름의 단일 응용 프로그램에서 두 개의 런타임 인스턴스를 로드하면 기본적으로 이러한 인스턴스는 인스턴스 열에 myappmyapp#1로 지정됩니다. 이 경우 myappmyapp#1이 같은 이름을 가진 두 개의 응용 프로그램을 나타내는지 아니면 두 개의 런타임이 있는 하나의 응용 프로그램을 나타내는지 명확하지 않습니다. 이름이 같은 여러 응용 프로그램에서 여러 개의 런타임을 로드하는 경우에는 훨씬 더 모호해집니다.

레지스트리 키를 설정하여 이러한 모호성을 제거할 수 있습니다. .NET Framework 4을 사용하여 개발한 응용 프로그램의 경우 이러한 레지스트리 변경을 통해 인스턴스 열에 표시되는 해당 응용 프로그램 이름에 프로세스 식별자와 런타임 인스턴스 식별자를 차례로 추가할 수 있습니다. 그러면 이러한 응용 프로그램이 인스턴스 열에서 application 또는 application#1 대신 application_pprocessID_rruntimeID로 식별됩니다. 이전 버전의 공용 언어 런타임을 사용하여 개발된 응용 프로그램의 인스턴스는 .NET Framework 4이 설치된 경우 application_pprocessID로 표시됩니다.

In-Process Side-By-Side 응용 프로그램의 성능 카운터

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

키 이름

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();

이러한 레지스트리 변경을 수행하면 .NET Framework 4을 대상으로 하는 응용 프로그램의 이름이 Perfmon.exe에서 application_pprocessID_rruntimeID로 표시됩니다. 여기서 application은 응용 프로그램 이름이고, processID는 응용 프로그램의 프로세스 식별자이며, runtimeID는 공용 언어 런타임 식별자입니다. 예를 들어 myapp.exe라는 이름의 응용 프로그램에서 두 개의 공용 언어 런타임 인스턴스를 로드하면 Perfmon.exe에서 한 인스턴스는 myapp_p1416_r10으로 식별되고 다른 한 인스턴스는 myapp_p3160_r10으로 식별될 수 있습니다. 런타임 식별자는 프로세스 내의 런타임을 구별하는 데만 사용되며 런타임에 대한 기타 다른 정보를 제공하지는 않습니다. 예를 들어, 런타임 ID는 런타임의 버전이나 SKU와 관계가 없습니다.

.NET Framework 4이 설치된 경우 이러한 레지스트리 변경이 이전 버전의 .NET Framework를 사용하여 개발한 응용 프로그램에도 영향을 주기 때문에 이러한 응용 프로그램이 Perfmon.exe에서 application_pprocessID로 표시됩니다. 여기서 application은 응용 프로그램 이름이고 processID는 프로세스 식별자입니다. 예를 들어, myapp.exe라는 이름을 가진 두 개의 응용 프로그램에 대한 성능 카운터를 모니터링하는 경우 한 성능 카운터는 myapp_p23900으로 표시되고 다른 한 성능 카운터는 myapp_p24908로 표시될 수 있습니다.

참고참고

프로세스 식별자는 이전 버전의 런타임을 사용하는 이름이 같은 두 개의 응용 프로그램을 명확하게 구별할 수 있게 합니다.이전 버전의 공용 언어 런타임에서는 Side-By-Side 시나리오를 지원하지 않기 때문에 이전 버전에는 런타임 식별자가 필요하지 않습니다.

.NET Framework 4이 없거나 제거된 경우 이 레지스트리 키를 설정해도 아무 효과가 없습니다. 즉, 이름이 같은 두 개의 응용 프로그램이 Perfmon.exe에서 application와 application#1(예: myappmyapp#1)로 계속 표시됩니다.