Windows 性能监视器使用及API函数调用
文|Seraph
01 | 性能监视器使用方法
- 打开管理工具-性能监视器-监视工具-性能监视器,如下:
02 | 性能监视器API调用方法
- 获取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;
}
- 如要获取其他计数器的值,换掉PdhAddCounter函数的输入参数路径即可。 ###03 | 基本指标含义
系统调用率 System Call/sec. 指运行在计算机上的所有处理器调用操作系统服务例行程序的综合速率。这些例行程序执行所有在计算机上的如安排和同步活动等基本的程序,并提供对非图形设备、内存管理和名称空间管理的访问。 如果Interrupts/sec大于System Calls/sec.,则系统中某一硬件设备产生过多的中断。 次/sec
Processor Queue Length 处理器队列的线程数量。此计数器只显示就绪线程,而不是正在运行的线程。 如果处理器队列中总是有两个以上的线程通常表示处理器堵塞。
进程切换率 Context Switches/sec 指计算机上的所有处理器全都从一个线程转换到另一个线程的综合速率。当正在运行的线程自动放弃处理器时出现上下文转换,由一个有更高优先就绪的线程占先或在用户模式和特权 (内核) 模式之间转换以使用执行或分系统服务 如果此计数器的数值较大,则表明锁定竞争很激烈,或者线程在用户和内核模式之间频繁切换。
