Windows 性能监视器使用及API函数调用

文|Seraph

01 | 性能监视器使用方法

  1. 打开管理工具-性能监视器-监视工具-性能监视器,如下:

02 | 性能监视器API调用方法

  1. 获取CPU利用率示例
#include "pdh.h"
#pragma comment(lib, "Pdh.lib")
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
          
   
        HQUERY m_hQuery;
        HCOUNTER hCounter;
        PDH_FMT_COUNTERVALUE *m_pDisplayValue;

        PDH_STATUS status = ERROR_SUCCESS;
        m_pDisplayValue = new PDH_FMT_COUNTERVALUE();
        status = PdhOpenQuery(NULL, 0, &m_hQuery);
        if (ERROR_SUCCESS == status)
        {
          
   
                status = PdhAddCounter(m_hQuery, _T("\Processor Information(_Total)\% Processor Utility"), 0, &hCounter);
                //WIN10以前的路径换成:\Processor(_Total)\% Processor Time
                if (ERROR_SUCCESS != status)
                {
          
   
                        return status;
                }
        }
        while(1)
        {
          
   
                PDH_STATUS status = ERROR_SUCCESS;
                DWORD dwCounterType = 0;		                        
                PdhCollectQueryData(m_hQuery);
                status = PdhGetFormattedCounterValue(hCounter, PDH_FMT_DOUBLE, &dwCounterType, m_pDisplayValue);
                double dCpuLoad = *(double *)((char *)m_pDisplayValue + 8) ;
                printf("CPULoad:%f
", dCpuLoad);
                Sleep(500);
        }
         return 0;
}
  1. 如要获取其他计数器的值,换掉PdhAddCounter函数的输入参数路径即可。 ###03 | 基本指标含义
指标名称 指标描述 指标范围 指标单位 %Processor Time % Processor Time指处理器执行非闲置线程时间的百分比。这个计数器设计成用来作为处理器活动的主要指示器。它通过在每个时间间隔中衡量处理器用于执行闲置处理线程的时间,并且用100%减去该值得出。可将其视为范例间隔用于做有用工作的百分比。 根据应用系统情况,在80%±5%范围内波动为宜。过低,则服务器CPU利用率不高;过高,则CPU可能成为系统的处理瓶颈。 % %Interrupts/sec 每秒钟设备中断处理器的次数。在完成一个任务或需要注意时,装置会发出中断讯号给处理器。可以产生中断的装置包括系统定时器、鼠标、数据通讯联机、网络卡以及其它的外部装置。在中断过程中,一般的执行绪执行将被暂停,而且一个中断可以使处理器切换到另一个具有较高优先等级的执行绪。频率中断是频繁和周期性的,并且中断动作在背景执行。 取决于处理器,越低越好;不宜超过1,000;如果该值显著增加而系统活动没有相应的增加,则表明存在硬件问题,需要检查引起中断的网络适配器、磁盘或其他硬件。 次/sec

系统调用率 System Call/sec. 指运行在计算机上的所有处理器调用操作系统服务例行程序的综合速率。这些例行程序执行所有在计算机上的如安排和同步活动等基本的程序,并提供对非图形设备、内存管理和名称空间管理的访问。 如果Interrupts/sec大于System Calls/sec.,则系统中某一硬件设备产生过多的中断。 次/sec

Processor Queue Length 处理器队列的线程数量。此计数器只显示就绪线程,而不是正在运行的线程。 如果处理器队列中总是有两个以上的线程通常表示处理器堵塞。

进程切换率 Context Switches/sec 指计算机上的所有处理器全都从一个线程转换到另一个线程的综合速率。当正在运行的线程自动放弃处理器时出现上下文转换,由一个有更高优先就绪的线程占先或在用户模式和特权 (内核) 模式之间转换以使用执行或分系统服务 如果此计数器的数值较大,则表明锁定竞争很激烈,或者线程在用户和内核模式之间频繁切换。

经验分享 程序员 微信小程序 职场和发展