如何获取CPU利用率?

thirdlee 2006-02-16 09:41:42
在各论坛搜了两天了,有说从loadavg文件获取的,也有说从stat文件获取的。关键是loadavg文件中给出的是1分钟,5分钟,15分钟的平均进程负载,该怎么用这三个数计算CPU利用率我还不明白。

至于stat文件,说是两次读取stat文件数据再计算,在一个网站上看到了计算方法,但我得出的结果总是0,因为前三个数总是相同的,我两次读取stat的文件的时间间隔分别取过1到5秒,结果都一样。是不是要间隔几分钟呢?我不知道。

有知道的大侠请指点一下。3ks
...全文
171 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
thirdlee 2006-02-17
  • 打赏
  • 举报
回复
stat文件是一直在变,但是关于CPU的前三个数两次读出来的值没变,第四个数倒是在变.

prstat是程序还是文件啊,我没找到啊.(抱歉,这个问题可能比较弱智,但我实在是不知道啊,接触LINUX少,结果现在要写这个.)
sunruyu 2006-02-17
  • 打赏
  • 举报
回复
简单:
用prstat就可以!
cym64039 2006-02-17
  • 打赏
  • 举报
回复
stat文件是一直在变的,怎么可能1-5秒都不变呢
lvsc 2006-02-17
  • 打赏
  • 举报
回复
用vmstat命令
Mybox 2006-02-17
  • 打赏
  • 举报
回复
后面一个是获取内存使用的
Mybox 2006-02-17
  • 打赏
  • 举报
回复
#define SET_IF_DESIRED(x,y) if(x) *(x) = (y)
#define _ULL unsigned long long

int FiveCpuNumbers(_ULL *uret,_ULL *nret,_ULL *sret,_ULL *iret,_ULL *iowait)
{
static _ULL u = 0, m = 0, s = 0, i = 0, iw = 0;
_ULL user_j, nice_j, sys_j, idle_j, iowait_j = 0;
FILE *fp;
size_t byte_read;
char buffer[100];

fp = fopen("/proc/stat", "r");
byte_read = fread(buffer, 1, sizeof(buffer)-1, fp);
fclose(fp);

if (byte_read==0 || byte_read==sizeof(buffer))
return -1;
buffer[byte_read] = '\0';

sscanf(buffer, "cpu %Lu %Lu %Lu %Lu %Lu", &user_j, &nice_j, &sys_j, &idle_j, &iowait_j);
SET_IF_DESIRED(uret, user_j - u);
SET_IF_DESIRED(nret, nice_j - m);
SET_IF_DESIRED(sret, sys_j - s);
/* Idle can go backwards one tick due to kernel calculation issues */
SET_IF_DESIRED(iret, (idle_j > i) ? (idle_j - i) : 0);
SET_IF_DESIRED(iowait, iowait_j - iw);
u = user_j;
m = nice_j;
s = sys_j;
i = idle_j;
iw = iowait_j;
printf("cpu %Lu %Lu %Lu %Lu %Lu \n",user_j,nice_j,sys_j,idle_j,iowait_j);

return 0;
}

/*
* get the cpu usage
*/
int ReadCpuInfo(float &fCpuUsage)
{
float cpu_usage;
_ULL user_j, nice_j, sys_j, idle_j, iowait_j = 0;

if(FiveCpuNumbers(&user_j, &nice_j, &sys_j, &idle_j, &iowait_j)!=0)
return -1;
usleep(500000);
if(FiveCpuNumbers(&user_j, &nice_j, &sys_j, &idle_j, &iowait_j)!=0)
return -1;
usleep(500000);
if(FiveCpuNumbers(&user_j, &nice_j, &sys_j, &idle_j, &iowait_j)!=0)
return -1;

cpu_usage = (idle_j * 100.0) / (user_j + nice_j + sys_j + idle_j + iowait_j);

if (cpu_usage>100)
cpu_usage = 100.0;

/* change to useage */
cpu_usage = 100.0 - (cpu_usage);
printf("### CPU Usage : %0.3f %%\n", cpu_usage);
return 0;
}
#undef _ULL

/*
* get the mm usage
*/
int GetMemUsage()
{
float memusage;
FILE *fp;
char buffer[1024];
size_t byte_read;
char *pos;
int totalmem;
int freemem;

fp = fopen("/proc/meminfo", "r");
byte_read = fread(buffer, 1, sizeof(buffer), fp);
fclose(fp);

if (byte_read==0 || byte_read==sizeof(buffer))
return -1;
buffer[byte_read] = '\0';
pos = strstr(buffer, "MemTotal:");
if (NULL==pos)
return -1;
sscanf(pos, "MemTotal: %d kB", &totalmem);
pos = strstr(pos, "MemFree:");
if (NULL==pos)
return -1;
sscanf(pos, "MemFree: %d kB", &freemem);
memusage = (totalmem-freemem) * 100.0 / totalmem;
// printf("### MemUsage(total:%d free:%d %MEM:%3.2f%)\n", totalmem, freemem, memusage);

return 0;
}
Mybox 2006-02-17
  • 打赏
  • 举报
回复
头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>


#define _ULL unsigned long long
int FiveCpuNumbers(_ULL *uret,_ULL *nret,_ULL *sret,_ULL *iret,_ULL *iowait);
int ReadCpuInfo(float &fCpuUsage);
int GetMemUsage();


23,223

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧