使用注册表函数使用计数器数据

使用 注册表函数 从特殊 HKEY_PERFORMANCE_DATA 注册表项收集性能数据。

性能数据实际上并不存储在注册表中。 调用注册表函数会导致系统从相应的性能数据提供程序收集数据。

注意

通常不应使用注册表函数来使用计数器数据。 应 改用性能数据帮助程序 (PDH) 函数。 PDH 函数更易于使用,并避免了错误使用注册表函数时可能发生的许多性能和可靠性问题。

注意

如果要编写Windows OneCore应用,则无法使用注册表函数。 请改用 PerfLib V2 使用者函数

注册表函数是用于从 V1 提供程序收集数据的低级别 API。 注册表函数还支持通过调用 V2 使用者函数的转换层从 V2 提供程序收集数据。

若要从本地系统获取性能数据,请调用 RegQueryValueEx 函数。 使用 HKEY_PERFORMANCE_DATA 作为键。 第一次调用将打开密钥。 无需先显式打开密钥。

若要从远程系统获取性能数据,请调用 RegConnectRegistry 函数。 使用远程系统的计算机名称,并使用 HKEY_PERFORMANCE_DATA 作为密钥。 此调用检索表示远程系统性能数据的密钥。 使用此键而不是 HKEY_PERFORMANCE_DATA 键来检索数据。

获取完性能数据后,请务必使用 RegCloseKey 函数关闭键的句柄。 这对于本地和远程情况都很重要:

  • RegCloseKey(HKEY_PERFORMANCE_DATA) 实际上不会关闭注册表句柄,但它会清除所有缓存的数据并释放加载的性能 DLL。
  • RegCloseKey(hkeyRemotePerformanceData) 关闭远程计算机注册表的句柄。

重要

请勿在 期间DLL_PROCESS_DETACH调用 RegCloseKey(HKEY_PERFORMANCE_DATA)

使用 lpValueNameRegQueryValueEx 函数的 参数来指示要检索的信息。 下表列出了可以为 指定的 lpValueName值。 请注意,值字符串不区分大小写。

描述
Global 检索计算机上注册的所有性能对象(类别中包含的性能对象除外)的性能 Costly 数据。
OLD_Global Windows Vista 及更高版本: 检索计算机上注册的所有 V1 性能对象(类别中包含的对象除外)的性能 Costly 数据。 当你知道感兴趣的数据来自 V1 提供程序时,请使用此方法,而不是 Global 为了避免收集不必要的 V2 提供程序数据。
n1 n2 ... 检索一个或多个性能对象的性能数据。 指定要在空格分隔列表中检索的每个对象关联的十进制索引。 例如,如果要检索 System 和 Memory 对象,并且已确定相应名称字符串的索引为 2 和 4,请指定字符串 "2 4"。 请注意,查询可以返回与所请求的对象数量不同的对象。 如果指定的对象不可用、指定的对象依赖于另一个对象类型,或者提供程序以其他方式返回未直接请求的数据,则可能会发生这种情况。 例如,线程依赖于进程,因此,如果从 Thread 对象请求数据,则结果将包括来自 对象 Process 的数据。
Counter n 检索指定语言标识符的名称字符串,例如 英语 。Counter 9 使用返回的名称字符串查找与给定名称对应的索引,或查找与给定索引对应的名称。 有关详细信息 ,请参阅检索计数器名称和帮助文本 。 请注意,返回的列表包括对象 (计数器集) 名称和计数器名称 -- 没有简单的方法来确定名称是对象名称还是计数器名称。
Help n 检索指定语言标识符的帮助字符串,例如 英语 。Help 9 使用返回的帮助字符串查找与对象 (计数器集) 或计数器帮助索引对应的说明。 有关详细信息 ,请参阅检索计数器名称和帮助文本
Costly 废弃: 检索其数据在处理器时间或内存使用量方面收集成本高昂的对象类型的性能数据。 在负载较重的计算机上,此集合可能需要几分钟时间。 如果应用程序需要在此数据收集过程中响应用户,则应在工作线程上执行收集。
MetadataGlobal Windows 10 20H1 及更高版本:检索计算机上注册的所有性能对象的元数据,但类别中包含的Costly性能对象除外。
OLD_MetadataGlobal Windows 10 20H1 及更高版本:检索计算机上注册的所有 V1 性能对象的元数据,但类别中包含的Costly对象除外。
MetadataCostly Windows 10 20H1 及更高版本:检索成本高昂的性能对象的元数据
OLD_MetadataCostly Windows 10 20H1 及更高版本:检索成本高昂的 V1 性能对象的元数据

有关注册表返回的性能数据格式的详细信息,请参阅 性能数据格式

有关获取计算机上已注册计数器的名称和说明的示例,请参阅 检索计数器名称和帮助文本

有关访问性能数据组件的示例,请参阅 显示对象、实例和计数器名称

有关检索、计算和打印计数器值的示例,请参阅检索计数器数据和计算计数器值

元数据集合

Windows 10 20H1 添加了对仅元数据收集操作的支持。 这些操作旨在用于列出计算机上可用的性能对象和计数器。

  • 仅元数据集合可能比相应的完整数据收集更快,因为它可以跳过从支持仅元数据集合的对象收集实例数据。
  • 仅元数据集合使用的内存比相应的完整数据收集少,因为它不需要空间即可从支持仅元数据集合的对象返回实例数据。
  • 仅元数据集合比相应的完整数据收集更完整,因为即使没有支持仅元数据集合的对象实例,它也会返回可用计数器的列表。

提示

从具有多个进程或线程的服务器收集数据时,正确使用仅元数据集合尤其重要。 常规 Global 集合必须收集并返回系统上每个进程和线程的信息,而 MetadataGlobal 集合不需要收集进程或线程信息。

性能数据帮助程序 (PDH) 函数在确定计算机上可用的性能对象集时自动使用仅元数据集合。

操作系统对仅元数据操作的支持由注册表值中的 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\Supports Metadata 非零值指示。 如果此值不存在或设置为 0,请使用完整数据收集 (例如 Global) ,而不是仅元数据集合 (例如 MetadataGlobal) 。

并非所有性能对象都支持仅元数据集合。 请求MetadataGlobal集合时,Windows 将检查每个性能对象,以仅支持元数据 (注册表值) 中的HKLM\SYSTEM\CurrentControlSet\Services\<ServiceName>\Performance\Collect Supports Metadata非零值指示。 如果性能对象不支持仅元数据集合,Windows 将从 对象执行常规数据收集。 如果性能对象确实支持仅元数据集合,则 Windows 将从 对象执行仅元数据集合。 然后,返回给你的仅限元数据的查询的数据将包含 PERF_OBJECT_TYPE 来自完整数据和仅元数据集合的块。 这些 PERF_OBJECT_TYPE 块可能包含或省略实例信息,具体取决于块是从支持或不支持仅元数据查询的提供程序收集的。

从仅元数据集合返回的数据与普通集合中的数据相同,但以下情况除外:

  • NumInstances结构的字段PERF_OBJECT_TYPE可以是 PERF_METADATA_MULTIPLE_INSTANCES (指示对象支持 0 个或更多个命名实例) 或 PERF_METADATA_NO_INSTANCES (指示对象始终具有 1 个未命名实例) 。
  • 结构后PERF_OBJECT_TYPE不会PERF_INSTANCE_DEFINITION有块。

Perflib

注册表项 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib 支持与性能计数器集合相关的多个 DWORD 值。 对于默认行为,这些通常应未设置,但可由管理员根据需要针对特定方案进行配置。

  • Configuration Flags:默认值为 0。 可以设置为以下标志的组合,以启用特殊行为:
    • 0x01:不要测试插件是否有数据缓冲区对齐错误。 默认情况下,系统会验证插件的缓冲区对齐方式。
    • 0x02:不要自动禁用插件。 默认情况下,系统会禁用崩溃或表现出错误行为的插件。
    • 0x04:不验证插件缓冲区完整性。 默认情况下,系统会检查插件缓冲区溢出。
    • 0x08:不检查插件超时。 默认情况下,系统会检查插件是否挂起。
  • Disable Performance Counters:默认值为 0。 如果设置为 1,将为系统禁用 V1 性能计数器的收集。
  • ExtCounterTestLevel:默认值为 4。 控制系统执行多少验证以防止不正确的插件行为。 有关详细信息,请参阅PM_COLLECT_PROC