最近在調試中發現應用程序的CPU佔用率高,於是想看是那個線程專用了cpu。
# top
查看cpu專用率,這個時候打印的是進程級別cpu專用率。再按H,就有打印線程級別的cpu專用信息了
#top -H
linux 代碼實時監控cpu專用率
s_32 Timer_GetCpuStat_FUN(u_64 *user, u_64 *system, u_64 *nice,u_64 *idle, u_64 *iowait, u_64 *irq, u_64 *softirq)
{
static FILE* fp = NULL;
s_8 buf[512] = {0}, cpuName[32]={0};
fp = fopen( "/proc/stat", "r" );
if(fp == NULL)
{
errorPrintf(PRT_COMM,"查詢系統cpu專用率信息異常...\n");
return -1;
}
memset(buf, 0, sizeof(buf));
fgets( (s_8 *)buf, sizeof(buf), fp );
sscanf( buf, "%s %lld %lld %lld %lld %lld %lld %lld",\
cpuName, user, system, nice, idle, iowait, irq, softirq);
fclose(fp);
return 0;
}
/*
FUNCTION:
統計CPU 專用率函數
INPUT:
secNum : 統計時間間隔,top指令是5s 統計一次推薦使用5s
maxRate: 設置最高cpu 佔用比,當大於等於該數值異常提示
OUTPUT:
無
RETURN:
< 0 失敗
> 0 cpu專用率
OTHER:
接口在定時器函數中週期調用,工程接口1s 掉一次
AUTHER:ybq
*/
s_32 Timer_CpuRate_API(u_16 secNum, u_16 maxRate)
{
static u_32 num = 0;
static u_64 oldUser = 0, oldSystem = 0, oldNice = 0,oldIdle = 0, oldIowait = 0, oldIrq = 0, oldSoftirq = 0;
u_64 cUser = 0, cSystem = 0, cNice = 0,cIdle = 0, cIowait = 0, cIrq = 0, cSoftirq = 0;
s_32 ret = -1, rate = -1;
u_64 cTotal = 0, oldTotal = 0;
if(0 == num%secNum)
{
ret = Timer_GetCpuStat_FUN(&cUser, &cSystem, &cNice , &cIdle, &cIowait, &cIrq, &cSoftirq);
if(ret < 0)
{
num++;
return -1;
}
if(0 == num)
{
oldUser = cUser;
oldSystem = cSystem;
oldNice = cIdle;
oldIdle = cIdle;
oldIowait = cIowait;
oldIrq = cIrq;
oldSoftirq = cSoftirq;
}else
{
oldTotal = oldUser + oldSystem + oldNice + oldIdle + oldIowait + oldIrq + oldSoftirq;
cTotal = cUser + cSystem + cNice + cIdle + cIowait+ cIrq + cSoftirq;
//rate = (cSystem - oldSystem)*100/(cTotal - oldTotal);
rate = (cIdle- oldIdle )*100/(cTotal - oldTotal);
if(100-rate >= maxRate)
{
errorPrintf(PRT_COMM,"CPU專用率(%d)資源大於等於預設(%d),請注意分析...\n", 100-rate, maxRate);
}
oldUser = cUser;
oldSystem = cSystem;
oldNice = cNice;
oldIdle = cIdle;
oldIowait = cIowait;
oldIrq = cIrq;
oldSoftirq = cSoftirq;
}
}
num++;
return rate;
}