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

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

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

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

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

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

Для устранения такой неоднозначности можно задать раздел реестра. Для приложений, разработанных с использованием .NET Framework 4, это изменение реестра добавляет идентификатор процесса и идентификатор экземпляра среды выполнения к имени приложения в столбце Экземпляр. Вместо идентификатора приложение или приложение#1, приложение теперь обозначается в столбце Экземпляр как приложение_pИД_процесса_rИД_среды_выполнения. Если приложение было разработано с использованием предыдущей версии среды CLR, этот экземпляр отображается как приложение_pИД_процесса (при условии, что установлена платформа .NET Framework 4).

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

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

Имя раздела

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

Имя значения

ProcessNameFormat

Тип значения

REG_DWORD

Значение

1 (0x00000001)

Значение 0 для ProcessNameFormat указывает, что включено поведение по умолчанию; то есть, Perfmon.exe отображает счетчики производительности по приложениям. Если установить значение 1, Perfmon.exe будет различать несколько версий приложения и предоставлять счетчики производительности по средам выполнения. Любые другие значения раздела реестра ProcessNameFormat не поддерживаются и зарезервированы для дальнейшего использования.

После обновления значения раздела реестра ProcessNameFormat необходимо перезапустить Perfmon.exe или какие-либо другие пользовательские счетчики производительности для правильной работы функции именования экземпляров.

В следующем примере показан программный способ изменения значения ProcessNameFormat.

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

Если в реестр внесено это изменение, программа Perfmon.exe отображает имена приложений, нацеленных на .NET Framework 4, как приложение_pИД_процесса_rИД_среды_выполнения, где приложение — это имя приложения, ИД_процесса — идентификатор процесса приложения, а ИД_среды_выполнения — идентификатор среды CLR. Например, если приложение с именем myapp.exe загружает два экземпляра среды CLR, то программа Perfmon.exe может отображать один экземпляр как myapp_p1416_r10, а второй как myapp_p3160_r10. Идентификатор среды выполнения только однозначно обозначает среды выполнения в пределах процесса; он не содержит никаких других сведений о среде выполнения. (Например, идентификатор среды выполнения никак не связан с версией или SKU среды выполнения.)

Если установлена платформа .NET Framework 4, это изменение реестра также влияет на приложения, разработанные с помощью более ранних версий платформы .NET Framework. Они отображаются в программе Perfmon.exe как приложение_pИД_процесса, где приложение — это имя приложения, а ИД_процесса — идентификатор процесса. Например, если контролируются счетчики производительности двух приложений с именем myapp.exe, одно может отображаться как myapp_p23900, а другое — как myapp_p24908.

ПримечаниеПримечание

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

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