Поделиться через


Счетчики производительности и приложения с боковыми In-ProcessBy-Side

Замечание

Эта статья связана с .NET Framework. Он не применяется к более новым реализациям .NET, включая .NET 6 и более поздние версии.

С помощью монитора производительности (Perfmon.exe) можно дифференцировать счетчики производительности в зависимости от среды выполнения. В этом разделе описывается изменение реестра, необходимое для включения этой функции.

Поведение по умолчанию

По умолчанию монитор производительности отображает счетчики производительности на основе каждого приложения. Однако существует два сценария, в которых это проблематично.

  • При мониторинге двух приложений с одинаковым именем. Например, если оба приложения называются myapp.exe, одно будет отображаться как myapp, а другое как myapp#1 в столбце Instance. В этом случае сложно сопоставить счетчик производительности с определенным приложением. Неясно, относятся ли данные, собранные для myapp#1 , к первой myapp.exe или второй myapp.exe.

  • Когда приложение использует несколько экземпляров общей среды выполнения. Платформа .NET Framework 4 поддерживает сценари� внутрипроцессного размещения; то есть один процесс или приложение может загружать несколько экземпляров общеязыковой среды CLR. Если одно приложение с именем myapp.exe загружает два экземпляра среды выполнения, по умолчанию они будут назначены в столбце "Экземпляр " в качестве myapp и myapp#1. В этом случае неясно, относится ли myapp и myapp#1 к двум приложениям с одинаковым именем или к одному приложению с двумя средами выполнения. Если несколько приложений с одинаковым именем загружают несколько сред выполнения, неоднозначность еще больше.

Чтобы устранить эту неоднозначность, можно задать ключ реестра. Для приложений, разработанных с помощью .NET Framework 4, это изменение реестра добавляет идентификатор процесса, за которым следует идентификатор экземпляра среды выполнения, в столбец Экземпляр имени приложения. Вместо приложения или приложения#1 приложение теперь определяется как application_pprocessID_rruntimeID в столбце Instance. Если приложение было разработано с помощью предыдущей версии среды CLR, этот экземпляр представлен как application_pprocessID , если установлен .NET Framework 4.

Счетчики производительности для параллельных приложений In-Process

Чтобы обрабатывать счетчики производительности для нескольких версий общей среды выполнения, размещенных в одном приложении, необходимо изменить настройку одного ключа в реестре, как показано в следующей таблице.

Ценность
Ключ HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\.NETFramework\Performance
запись ProcessNameFormat
Тип 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, где приложение — имя приложения, а идентификатор процесса — идентификатор процесса приложения. Например, если приложение с именем myapp.exe загружает два экземпляра среды CLR, Perfmon.exe может определить один экземпляр как myapp_1416 и второй как myapp_3160.

Замечание

Идентификатор процесса устраняет неоднозначность разрешения двух приложений с одинаковым именем, использующее более ранние версии среды выполнения. Идентификатор среды выполнения не требуется для предыдущих версий, так как предыдущие версии среды CLR не поддерживают параллельные сценарии.

Если .NET Framework 4 или более поздняя версия отсутствует или была удалена, изменение ключа реестра не окажет никакого эффекта. Это означает, что два приложения с одинаковым именем будут отображаться в Perfmon.exe как приложение и приложение#1 (например, myapp и myapp#1).