Счетчики производительности и внутрипроцессные параллельные приложения
Примечание.
Эта статья относится к .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_p
processID_r
runtimeID в столбце экземпляра. Если приложение было разработано с помощью предыдущей версии среды CLR, этот экземпляр представлен как application_p
processID, если установлен платформа .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_p
processID, где приложение является именем приложения, а processID — идентификатор процесса приложения. Например, если приложение с именем myapp.exe загружает два экземпляра среды CLR, Perfmon.exe может определить один экземпляр как myapp_1416 и второй как myapp_3160.
Примечание.
Идентификатор процесса позволяет устранить неоднозначность при идентификации двух приложений с одинаковыми именами, использующих более ранние версии среды выполнения. Идентификатор среды выполнения для более ранних версий общеязыковой среды выполнения не нужен, поскольку в них не поддерживаются сценарии параллельного размещения.
Если платформа .NET Framework 4 или более поздней версии отсутствует или удалена, установка раздела реестра не влияет. Это означает, что два приложения с одинаковым именем будут по-прежнему отображаться в программе Perfmon.exe как приложение и приложение#1 (например, myapp и myapp#1).