【问题标题】:Upgrading to Windows 7 breaks performance counters升级到 Windows 7 会破坏性能计数器
【发布时间】:2017-03-02 22:23:41
【问题描述】:

所以,我的工作场所终于开始用 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

我尝试运行 lodctr /r 来重建性能计数器,但这未能解决问题。

NT 4.0 和 6.1 之间是否发生了某些变化,导致这些性能计数器不再起作用?我怎样才能让它们工作?

【问题讨论】:

    标签: windows performancecounter


    【解决方案1】:

    我发现了问题。一些计数器需要调用PdhCollectQueryData 才能检索它们的数据。 Windows NT 4.0 原谅了这个遗漏,但 Windows 7 没有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 2012-04-01
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多