Contadores de desempenho e aplicativos lado a lado em processo

Observação

Este artigo é específico para aplicativos .NET Framework. Não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.

Usando o Monitor de Desempenho (Perfmon.exe), é possível diferenciar os contadores de desempenho por runtime. Este tópico descreve a alteração do Registro necessária para habilitar essa funcionalidade.

O comportamento padrão

Por padrão, o Monitor de Desempenho exibe os contadores de desempenho classificados por aplicativo. No entanto, há dois cenários em que isso torna-se um problema:

  • Ao monitorar dois aplicativos que têm o mesmo nome. Por exemplo, se ambos os aplicativos são nomeados myapp.exe, um é exibido como myapp e o outro como myapp#1 na coluna Instância. Nesse caso, é difícil corresponder um contador de desempenho a um aplicativo específico. Não está claro se os dados coletados para myapp#1 referem-se ao primeiro myapp.exe ou ao segundo.

  • Quando um aplicativo usa várias instâncias do Common Language Runtime. O .NET Framework 4 dá suporte a cenários de hospedagem lado a lado em processo, ou seja, um único processo ou aplicativo pode carregar várias instâncias do Common Language Runtime. Se um único aplicativo chamado myapp.exe carrega duas instâncias de runtime, por padrão, elas serão designadas na coluna Instância como myapp e myapp#1. Nesse caso, não está claro se myapp e myapp#1 referem-se a dois aplicativos de mesmo nome ou ao mesmo aplicativo com dois runtimes. Se vários aplicativos com o mesmo nome carregam vários runtimes, a ambiguidade é ainda maior.

Você pode definir uma chave do Registro para eliminar essa ambiguidade. Para aplicativos desenvolvidos usando o .NET Framework 4, essa alteração no registro adiciona um identificador de processo seguido por um identificador de instância de runtime ao nome do aplicativo na coluna Instância. Em vez de aplicativo ou aplicativoN.º1, o aplicativo agora é identificado como aplicativo_pprocessID_rruntimeID na coluna Instância. Se um aplicativo foi desenvolvido usando uma versão anterior do Common Language Runtime, essa instância será representada como aplicativopprocessID se o .NET Framework 4 estiver instalado.

Contadores de desempenho para aplicativos lado a lado em processo

Para lidar com contadores de desempenho para várias versões do Common Language Runtime hospedadas em um único aplicativo, você deve alterar uma única configuração de chave do Registro, conforme mostrado na tabela a seguir.

Valor
Chave HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\.NETFramework\Performance
Entry ProcessNameFormat
Tipo REG_DWORD
Valor 2 (0x00000002)

Um valor de 0 para ProcessNameFormat indica que o comportamento padrão está habilitado, ou seja, Perfmon.exe exibe os contadores de desempenho por aplicativo. Quando você define esse valor como 2, o Perfmon.exe elimina a ambiguidade de várias versões de um aplicativo e fornece contadores de desempenho por runtime. Qualquer outro valor para a configuração da chave do Registro ProcessNameFormat não tem suporte e é reservada para uso futuro.

Depois de atualizar a configuração da chave do Registro ProcessNameFormat, você deve reiniciar Perfmon.exe ou outros consumidores de contadores de desempenho para que o novo recurso de nomeação de instância funcione corretamente.

O exemplo a seguir mostra como alterar o valor de ProcessNameFormat programaticamente.

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

Ao fazer essa alteração no registro e se o .NET Framework 4 ou posterior estiver instalado, o Perfmon.exe exibirá os nomes dos aplicativos como aplicativo_pprocessID, em que aplicativo será o nome do aplicativo e processID será o identificador do processo do aplicativo. Por exemplo, se um aplicativo nomeado myapp.exe carregar duas instâncias do Common Language Runtime, o Perfmon.exe poderá identificar uma instância como myapp_1416 e a segunda como myapp_3160.

Observação

O identificador de processo elimina a ambiguidade da resolução de dois aplicativos com o mesmo nome que usam versões anteriores do runtime. Um identificador de tempo de execução não é necessário para versões anteriores, porque versões anteriores do Common Language Runtime não dão suporte a cenários lado a lado.

Se o .NET Framework 4 ou uma versão posterior não estiver presente ou foi desinstalado, a configuração da chave do Registro não terá efeito. Isso significa que dois aplicativos com o mesmo nome continuarão a aparecer no Perfmon.exe como aplicativo e aplicativo#1 (por exemplo, como myapp e myapp#1).