升级到 Windows 7 个中断性能计数器
Upgrading to Windows 7 breaks performance counters
所以,我的工作场所终于开始用 Windows 7 替换 Windows NT 4 系统。而且我必须确保我们的旧程序可以 运行新系统。
一个没有的是跟踪内存、CPU、磁盘和网络使用情况的“性能检查”服务。它严重依赖性能计数器。
我的问题是,在新的 Windows 7 框上,一些性能计数器不再工作:我在尝试读取值时遇到 PDH_INVALID_DATA
错误。该问题特别影响以下计数器:
\Network Interface(*)\Bytes Total/sec
\PhysicalDisk(_Total)\% Disk Time
\PhysicalDisk(_Total)\Avg. Disk Queue Length
\PhysicalDisk(_Total)\Disk Transfers/sec
\Processor(_Total)\% Processor Time
\Server\Bytes Total/sec
但同一程序中使用的其他计数器确实有效(经过一些小修改以处理“TCP”计数器被拆分为“TCPv4”和“TCPv6”)。
\Memory\Commit Limit
\Memory\Committed Bytes
\Process(_Total)\Thread Count
\TCPv4\Connections Established
\TCPv4\Segments/sec
涉及的代码(通过仅显示一个性能计数器进行了简化)是:
HQUERY hQuery;
HCOUNTER hCPUUsed;
DWORD dwType;
PDH_FMT_COUNTERVALUE stCounter;
lStatus = PdhOpenQuery(NULL, 0, &hQuery); // This same HQUERY object is used for all PDH calls
// ... error handling
lStatus = PdhAddCounter(hQuery, "\Processor(_Total)\% Processor Time", 0, &hCPUUsed);
// ... error handling
lStatus = PdhGetFormattedCounterValue(hCPUUsed, PDH_FMT_DOUBLE, &dwType, &stCounter);
// ... error handling, logging a PDH_INVALID_DATA error from the above line
我尝试 运行ning lodctr /r
重建性能计数器,但这未能解决问题。
是否在 NT 4.0 和 6.1 之间发生了某些变化导致这些性能计数器不再工作?我怎样才能让他们工作?
我发现了问题。一些计数器需要调用 PdhCollectQueryData 才能检索它们的数据。 Windows NT 4.0 原谅了遗漏,但 Windows 7 没有。
所以,我的工作场所终于开始用 Windows 7 替换 Windows NT 4 系统。而且我必须确保我们的旧程序可以 运行新系统。
一个没有的是跟踪内存、CPU、磁盘和网络使用情况的“性能检查”服务。它严重依赖性能计数器。
我的问题是,在新的 Windows 7 框上,一些性能计数器不再工作:我在尝试读取值时遇到 PDH_INVALID_DATA
错误。该问题特别影响以下计数器:
\Network Interface(*)\Bytes Total/sec
\PhysicalDisk(_Total)\% Disk Time
\PhysicalDisk(_Total)\Avg. Disk Queue Length
\PhysicalDisk(_Total)\Disk Transfers/sec
\Processor(_Total)\% Processor Time
\Server\Bytes Total/sec
但同一程序中使用的其他计数器确实有效(经过一些小修改以处理“TCP”计数器被拆分为“TCPv4”和“TCPv6”)。
\Memory\Commit Limit
\Memory\Committed Bytes
\Process(_Total)\Thread Count
\TCPv4\Connections Established
\TCPv4\Segments/sec
涉及的代码(通过仅显示一个性能计数器进行了简化)是:
HQUERY hQuery;
HCOUNTER hCPUUsed;
DWORD dwType;
PDH_FMT_COUNTERVALUE stCounter;
lStatus = PdhOpenQuery(NULL, 0, &hQuery); // This same HQUERY object is used for all PDH calls
// ... error handling
lStatus = PdhAddCounter(hQuery, "\Processor(_Total)\% Processor Time", 0, &hCPUUsed);
// ... error handling
lStatus = PdhGetFormattedCounterValue(hCPUUsed, PDH_FMT_DOUBLE, &dwType, &stCounter);
// ... error handling, logging a PDH_INVALID_DATA error from the above line
我尝试 运行ning lodctr /r
重建性能计数器,但这未能解决问题。
是否在 NT 4.0 和 6.1 之间发生了某些变化导致这些性能计数器不再工作?我怎样才能让他们工作?
我发现了问题。一些计数器需要调用 PdhCollectQueryData 才能检索它们的数据。 Windows NT 4.0 原谅了遗漏,但 Windows 7 没有。