如何读取 Windows 性能计数器?

Posted

技术标签:

【中文标题】如何读取 Windows 性能计数器?【英文标题】:how to read windows perfmon counter? 【发布时间】:2012-06-08 17:52:41 【问题描述】:

我可以获得一个 C++ 代码来读取 Windows 性能计数器(类别、计数器名称和实例名称)吗?

在 c# 中很容易,但我需要 c++ 代码。

谢谢

【问题讨论】:

查看我朋友的博文。我们将此代码用于一些内部工具。 askldjd.wordpress.com/2011/01/05/a-pdh-helper-class-cpdhquery 谢谢,但我正在寻找一种代码来读取一个计数器值。我不想用通配符查询。例如,我需要阅读以下计数器 \\Processor Information(_Total)\% Processor Time 【参考方案1】:

正如 Doug T. 之前指出的,我不久前发布了一个帮助程序类来查询性能计数器值。该类的使用非常简单,您所要做的就是为性能计数器提供字符串。 http://askldjd.wordpress.com/2011/01/05/a-pdh-helper-class-cpdhquery/

但是,我在博客上发布的代码已在实践中进行了修改。从您的评论来看,您似乎只对查询一个字段感兴趣。

在这种情况下,请尝试将以下函数添加到我的 CPdhQuery 类中。

double CPdhQuery::CollectSingleData()

    double data = 0;
    while(true)
    
        status = PdhCollectQueryData(hQuery);

        if (ERROR_SUCCESS != status)
        
            throw CException(GetErrorString(status));
        

        PDH_FMT_COUNTERVALUE cv;
        // Format the performance data record.
        status = PdhGetFormattedCounterValue(hCounter,
            PDH_FMT_DOUBLE,
            (LPDWORD)NULL,
            &cv);

        if (ERROR_SUCCESS != status)
        
            continue;
        

        data = cv.doubleValue;

        break;

    

    return data;

例如 获取处理器时间

counter = boost::make_shared<CPdhQuery>(std::tstring(_T("\\Processor Information(_Total)\% Processor Time")));

获取文件读取字节数/秒:

counter = boost::make_shared<CPdhQuery>(std::tstring(_T("\\System\\File Read Bytes/sec")));

要获得 % Committed Bytes:

counter = boost::make_shared<CPdhQuery>(std::tstring(_T("\\Memory\\% Committed Bytes In Use")));

要获取数据,请执行此操作。

double data = counter->CollectSingleData();

我希望这会有所帮助。

...艾伦

【讨论】:

【参考方案2】:

一些常用的性能值有 API 调用可以直接获取它们。比如总处理器时间可以从GetSystemTimes得到,百分比可以自己计算。

如果这不是一个选项,那么Performance Data Helper 库提供了一个相对简单的性能数据接口。

【讨论】:

以上是关于如何读取 Windows 性能计数器?的主要内容,如果未能解决你的问题,请参考以下文章

我可以从 Windows 中的用户模式程序中读取 CPU 性能计数器吗?

如何在 C++ 中读取性能计数器

windows下使用性能计数器遇到的坑

C# 不提供 Windows 性能计数器(在 Azure 辅助角色上)

如何通过sql server远程收集windows性能计数器

WMI 查询 - 2008 性能计数器警报