性能计数器和进程内并行应用程序

注释

本文特定于 .NET Framework。 它不适用于 .NET 的较新版本实现,包括 .NET 6 及更高版本。

使用性能监视器(Perfmon.exe),可以基于每个运行时区分性能计数器。 本主题介绍启用此功能所需的注册表更改。

默认行为

默认情况下,性能监视器按应用程序显示性能计数器。 但是,有两种情况存在问题:

  • 当监视两个名称相同的应用程序时。 例如,如果两个应用程序都命名为 myapp.exe,则一个应用程序将显示为 myapp,另一个显示为实例列中的 myapp#1。 在这种情况下,很难将性能计数器与特定应用程序匹配。 目前还不清楚为 myapp#1 收集的数据是第一个 myapp.exe 还是第二个 myapp.exe。

  • 当应用程序使用公共语言运行时的多个实例时。 .NET Framework 4 支持进程内并行托管方案;也就是说,单个进程或应用程序可以加载公共语言运行时的多个实例。 如果名为 myapp.exe 的单个应用程序加载两个运行时实例,则默认情况下,它们将在 实例 列中指定为 myappmyapp#1。 在这种情况下,目前还不清楚 myappmyapp#1 是引用同名的两个应用程序,还是引用具有两个运行时的同一应用程序。 如果多个具有相同名称的应用程序加载多个运行时,则歧义性甚至更大。

可以设置注册表项来消除此歧义性。 对于使用 .NET Framework 4 开发的应用程序,此注册表更改会将进程标识符后跟运行时实例标识符添加到 实例 列中的应用程序名称。 现在,应用程序将在“实例”列中标识为 application_processIDruntimeID,而不是 application 或 application#1。pr 如果使用以前版本的公共语言运行时开发应用程序,则前提是安装了 .NET Framework 4,该实例将表示 为 application_pprocessID

In-Process 并行应用程序的性能计数器

若要处理单个应用程序中托管的多个公共语言运行时版本的性能计数器,必须更改单个注册表项设置,如下表所示。

价值
密钥 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\.NETFramework\Performance
条目 进程名称格式
类型 REG_DWORD
价值 2 (0x00000002)

指示默认行为已启用的 ProcessNameFormat 值为 0;即 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 的应用程序加载公共语言运行时的两个实例,Perfmon.exe 可能会将一个实例标识为myapp_1416,第二个实例标识为myapp_3160。

注释

进程标识符可消除在解析名称相同且使用运行时早期版本的两个应用程序时存在的歧义性。 以前版本不需要运行时标识符,因为以前版本的公共语言运行时不支持并行方案。

如果 .NET Framework 4 或更高版本不存在或已卸载,则设置注册表项不起作用。 这意味着,具有相同名称的两个应用程序将继续作为 应用程序和application#1 出现在 Perfmon.exe(例如 ,myappmyapp#1)。