Contadores de rendimiento y aplicaciones en paralelo en proceso

Con Monitor de rendimiento (Perfmon.exe), es posible diferenciar los contadores de rendimiento según el runtime. En este tema se describe el cambio que hay que realizar en el Registro para habilitar esta funcionalidad.

El comportamiento predeterminado

De forma predeterminada, Monitor de rendimiento muestra los contadores de rendimiento según la aplicación. Sin embargo, hay dos escenarios en los que esto es problemático:

  • Cuando supervisa dos aplicaciones que tienen el mismo nombre. Por ejemplo, si ambas aplicaciones se llaman miapl.exe, una se mostrará como miapl y la otra como miapl#1 en la columna Instancia. En este caso, es difícil hacer coincidir un contador de rendimiento con una aplicación determinada. No está claro si los datos recopilados para miapl#1 hace referencia a la primera miapl.exe o a la segunda miapl.exe.

  • Cuando una aplicación usa varias instancias de Common Language Runtime. .NET Framework versión 4 admite escenarios de hospedaje en paralelo en el mismo proceso; es decir, un único proceso o aplicación puede cargar varias instancias de Common Language Runtime. Si una única aplicación llamada miapl.exe carga dos instancias en tiempo de ejecución, de forma predeterminada, se designarán en la columna Instancia como miapl y miapl#1. En este caso, no está claro si miapl y miapl#1 se refieren a dos aplicaciones que tienen el mismo nombre o a la misma aplicación con dos runtime. Si varias aplicaciones que tienen el mismo nombre cargan varios runtime, la ambigüedad es aún mayor.

Puede establecer una clave del Registro para eliminar esta ambigüedad. Para las aplicaciones desarrolladas con .NET Framework 4, este cambio del Registro agrega un identificador de proceso seguido de un identificador de instancia en tiempo de ejecución al nombre de la aplicación en la columna Instancia. En lugar de aplicación o aplicación#1, la aplicación se identifica ahora como aplicación_pIdProceso_rIdTiempoDeEjecución en la columna Instancia. Si una aplicación se desarrolló usando una versión anterior de Common Language Runtime, esa instancia se representará como aplicación_pIdProceso suponiendo que .NET Framework 4 esté instalado.

Contadores de rendimiento para aplicaciones en paralelo en proceso

Para administrar los contadores de rendimiento para varias versiones de Common Language Runtime hospedadas en una única aplicación, debe cambiar un único valor de clave del Registro, como se muestra en la tabla siguiente.

Nombre de clave

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

Nombre del valor

ProcessNameFormat

Tipo de valor

REG_DWORD

Valor

1 (0x00000001)

El valor 0 para ProcessNameFormat indica que está habilitado el comportamiento predeterminado; es decir, Perfmon.exe muestra los contadores de rendimiento por aplicación. Cuando se establece este valor en 1, Perfmon.exe elimina la ambigüedad entre varias versiones de una aplicación y proporciona contadores de rendimiento por runtime. De momento, no se admite ningún otro valor para la clave del Registro ProcessNameFormat.

Después de actualizar el valor de la clave del Registro ProcessNameFormat, es preciso reiniciar Perfmon.exe o cualquier otro consumidor de los contadores de rendimiento para que la nueva característica de nomenclatura de instancias funcione correctamente.

En el ejemplo siguiente, se muestra cómo cambiar el valor de ProcessNameFormat mediante programación.

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

Cuando realiza este cambio en el Registro, Perfmon.exe muestra los nombres de las aplicaciones destinadas a .NET Framework 4 como aplicación_pIdProceso_rIdTiempoDeEjecución, donde aplicación es el nombre de la aplicación, IdProceso es el identificador de proceso de la aplicación e IdTiempoDeEjecución es un identificador de Common Language Runtime. Por ejemplo, si una aplicación denominada miapl.exe carga dos instancias de Common Language Runtime, Perfmon.exe puede identificar una instancia como miapl_p1416_r10 y la otra como miapl_p3160_r10. El identificador en tiempo de ejecución solo elimina la ambigüedad de los runtime dentro de un proceso; no proporciona ninguna otra información sobre el runtime. (Por ejemplo, el Id. de tiempo de ejecución no tiene ninguna relación con la versión o la SKU del runtime.)

Si .NET Framework 4 está instalado, el cambio del Registro también afecta a las aplicaciones desarrolladas con versiones anteriores de .NET Framework. Aparecen en Perfmon.exe como aplicación_pIdProceso, donde aplicación es el nombre de la aplicación e IdProceso es el identificador de proceso. Por ejemplo, si se supervisan los contadores de rendimiento de dos aplicaciones llamadas miapl.exe, una podría aparecer como miapl_p23900 y la otra como miapl_p24908.

NotaNota

El identificador de proceso elimina la ambigüedad de resolver dos aplicaciones con el mismo nombre que usan versiones anteriores del runtime.No es necesario un identificador del tiempo de ejecución para las versiones anteriores, ya que las versiones anteriores de Common Language Runtime no admiten escenarios en paralelo.

Si .NET Framework 4 no está presente o se ha desinstalado, establecer la clave del Registro no produce ningún efecto. Esto significa que dos aplicaciones con el mismo nombre seguirán apareciendo en Perfmon.exe como aplicación y aplicación#1 (por ejemplo, como miapl y miapl#1).