Бөлісу құралы:


Счетчики производительности и внутрипроцессные параллельные приложения

Примечание.

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

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

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

По умолчанию системный монитор отображает счетчики производительности по приложениям. Тем не менее в двух случаях это может быть сопряжено с проблемами:

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

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

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

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

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

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

Примечание.

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

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