通过 winreg 查找 perfmon 计数器 id
Posted
技术标签:
【中文标题】通过 winreg 查找 perfmon 计数器 id【英文标题】:Finding perfmon counter id via winreg 【发布时间】:2009-07-13 12:43:35 【问题描述】:我有一个应用程序通过 winreg.h 中公开的 API 收集 Perfmon 计数器值 - 为了收集 Perfmon 计数器值,我必须调用 RegQueryValueExW
并传入我感兴趣的 Perfmon 计数器的 ID ,并且为了获得该 ID,我需要在注册表中查询 Perfmon 计数器名称列表,然后查找我感兴趣的那个
C++ 不是我选择的语言,所以下面是一个不稳定的例子,可能有很多语法错误,但你明白了:
DWORD IdProcessIndex = 0;
WCHAR* RawStrings = new WCHAR[ len ];
WCHAR* pCurrent;
DWORD nLenInChars;
// Get the name id of the "ID Process" counter
RegQueryValueExW(HKEY_PERFORMANCE_DATA, COUNTER009, 0, 0, (PBYTE)RawStrings, &len)
pCurrent = (WCHAR*)RawStrings;
while ( (nLenInChars = wcslen(pCurrent)) != 0 && IdProcessIndex == 0 )
WCHAR* pName;
pName = pCurrent + nLenInChars + 1;
if ( wcscmp( pName, L"ID Process" ) == 0)
IdProcessIndex = _wtoi( pCurrent );
pCurrent = pName + wcslen( pName ) + 1;
// Get data for the "ID Process" counter
WCHAR strIdProcessIndex[32];
_itow( nIdProcessIndex, strIdProcessIndex, 10 );
RegQueryValueExW(HKEY_PERFORMANCE_DATA, strIdProcessIndex, NULL, NULL, (PBYTE)pData, &len)
问题在于,在某些机器上(安装了 Windows CE 开发工具包的机器)还有一个名为“ID Process”的第二个 perfmon 计数器,因此上面找到了错误计数器的 ID。
除了它们的顺序之外,我看不出有任何方法可以区分这两者 - 目前我认为最好的选择是使用我找到的第一个具有匹配名称的计数器,有更好的选择吗?
(不可能将其迁移到 .Net 或类似的东西)
【问题讨论】:
【参考方案1】:我知道这是旧的,但如果它有帮助:
-
Tim 是对的,自己解析二进制数据很困难。为痛苦的世界做好准备。我推荐 PDH(为您封装注册表访问),或者如果失败,则推荐 WMI(尽管请注意 WMI 慢得多)。
您不能仅获取性能计数器的数据(
ID Process
,索引为784
)。您需要为整个对象获取它(Process
,索引为 230
)。
在所有 Windows 安装中,内置对象的 ID 为 guaranteed to be the same。因此,如果这是您需要的唯一计数器,请使用230
。 :)
【讨论】:
谢谢 - 我没有意识到这些 ID 是固定的。这让事情变得简单多了! 很高兴它很有用。请注意,这仅适用于内置计数器,而不适用于 Windows 之后安装的计数器,例如 SQL Server 计数器。【参考方案2】:我看不出有什么方法可以区分这两者
它们给出的值是否相同?如果是这样,你为什么要关心你使用哪一个?
如果它们不同,您可以同时尝试吗? (例如,两个 ID 上的 OpenProcess)
(不可能将其迁移到 .Net 或类似的东西)
如何使用 PDH API(例如 PdhOpenQuery)或 WMI 公开的 COM 接口?您可以使用本机 C++ 完成这两种操作。
我从来没有通过直接读取注册表来使用性能计数器,但可能有两个“ID 进程”计数器出于某种充分的原因(就像 WoW16/64 下的应用程序有单独的进程 ID?),还有一个替代将显示相同的内容。您是否在 AdminstrativeTools\Performance MMC 面板中看到其中两个?
【讨论】:
以上是关于通过 winreg 查找 perfmon 计数器 id的主要内容,如果未能解决你的问题,请参考以下文章
perfmon 性能计数器是不是基于与 xperf 使用的 ETW 事件“底层”相同的东西?
如何让 SqlServer 计数器的 .NET 数据提供程序显示在 Perfmon 中