您的位置:首页 > 运维架构 > Linux

cpu使用率 linux

2014-02-19 16:59 253 查看


获取linux系统CPU使用率

2010-12-12 09:08:11| 分类: Android|举报|字号 订阅

linux中监视系统运行信息,需要研究/proc下的一些信息,/proc/stat/给出了cpu的运行信息,先来分析一下

[work@builder ~]$ cat /proc/stat

cpu 432661 13295 86656 422145968 171474 233 5346

cpu0 123075 2462 23494 105543694 16586 0 4615

cpu1 111917 4124 23858 105503820 69697 123 371

cpu2 103164 3554 21530 105521167 64032 106 334

cpu3 94504 3153 17772 105577285 21158 4 24

intr 1065711094 1057275779 92 0 6 6 0 4 0 3527 0 0 0 70 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7376958 0 0 0 0 0 0 0 1054602 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0

ctxt 19067887

btime 1139187531

processes 270014

procs_running 1

procs_blocked 0

输出解释

CPU 以及CPU0、CPU1、CPU2、CPU3每行的每个参数意思(以第一行为例)为:

参数 解释

user (432661) 从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies) ,不包含 nice值为负进程。1jiffies=0.01秒

nice (13295) 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies)

system (86656) 从系统启动开始累计到当前时刻,核心时间(单位:jiffies)

idle (422145968) 从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies)

iowait (171474) 从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies) ,

irq (233) 从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies)

softirq (5346) 从系统启动开始累计到当前时刻,软中断时间(单位:jiffies)

CPU时间=user+system+nice+idle+iowait+irq+softirq

“intr”这行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数。

“ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。

“btime”给出了从系统启动到现在为止的时间,单位为秒。

“processes (total_forks) 自系统启动以来所创建的任务的个数目。

“procs_running”:当前运行队列的任务的数目。

“procs_blocked”:当前被阻塞的任务的数目。

通过两次读取/proc/stat文件,计算出cpu的busy和idle时间差。

代码只是简单的获取出CPU使用率,如果用到系统里,还是要用线程的。

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <stdarg.h>

#include <errno.h>

#define STATES_line2x4 "%s\03" \

" %#5.1f%% \02user,\03 %#5.1f%% \02system,\03 %#5.1f%% \02nice,\03 %#5.1f%% \02idle\03\n"

static const char *States_fmts = STATES_line2x4;

//Total number of CPU

static int Cpu_tot;

// These typedefs attempt to ensure consistent 'ticks' handling

typedef unsigned long long TIC_t;

// This structure stores a frame's cpu tics used in history

// calculations. It exists primarily for SMP support but serves

// all environments.

typedef struct CPU_t {

TIC_t u, n, s, i, w, x, y; // as represented in /proc/stat

TIC_t u_sav, s_sav, n_sav, i_sav, w_sav, x_sav, y_sav; // in the order of our display

unsigned id; // the CPU ID number

} CPU_t;

// This routine simply formats whatever the caller wants and

// returns a pointer to the resulting 'const char' string...

static const char *fmtmk (const char *fmts, ...)

{

static char buf[2048]; // with help stuff, our buffer

va_list va; // requirements exceed 1k

va_start(va, fmts);

vsnprintf(buf, sizeof(buf), fmts, va);

va_end(va);

return (const char *)buf;

}

static CPU_t *cpus_refresh (CPU_t *cpus)

{

static FILE *fp = NULL;

int i;

int num;

// enough for a /proc/stat CPU line (not the intr line)

char buf[256+64];

if (!fp) {

if (!(fp = fopen("/proc/stat", "r")))

printf("Failed /proc/stat open: %s", strerror(errno));

//cpus = calloc(1, (1 + Cpu_tot) * sizeof(CPU_t));

cpus = (CPU_t *)malloc((1 + Cpu_tot) * sizeof(CPU_t));

memset(cpus, '\0', (1 + Cpu_tot) * sizeof(CPU_t));

}

rewind(fp);

fflush(fp);

// first value the last slot with the cpu summary line

if (!fgets(buf, sizeof(buf), fp)) printf("failed /proc/stat read\n");

cpus[Cpu_tot].x = 0; // FIXME: can't tell by kernel version number

cpus[Cpu_tot].y = 0; // FIXME: can't tell by kernel version number

num = sscanf(buf, "cpu %Lu %Lu %Lu %Lu %Lu %Lu %Lu",

&cpus[Cpu_tot].u,

&cpus[Cpu_tot].n,

&cpus[Cpu_tot].s,

&cpus[Cpu_tot].i,

&cpus[Cpu_tot].w,

&cpus[Cpu_tot].x,

&cpus[Cpu_tot].y

);

if (num < 4)

printf("failed /proc/stat read\n");

// and just in case we're 2.2.xx compiled without SMP support...

if (Cpu_tot == 1) {

cpus[1].id = 0;

memcpy(cpus, &cpus[1], sizeof(CPU_t));

}

// now value each separate cpu's tics

for (i = 0; 1 < Cpu_tot && i < Cpu_tot; i++) {

if (!fgets(buf, sizeof(buf), fp)) printf("failed /proc/stat read\n");

cpus[i].x = 0; // FIXME: can't tell by kernel version number

cpus[i].y = 0; // FIXME: can't tell by kernel version number

num = sscanf(buf, "cpu%u %Lu %Lu %Lu %Lu %Lu %Lu %Lu",

&cpus[i].id,

&cpus[i].u, &cpus[i].n, &cpus[i].s, &cpus[i].i, &cpus[i].w, &cpus[i].x, &cpus[i].y

);

if (num < 4)

printf("failed /proc/stat read\n");

}

return cpus;

}

static void summaryhlp (CPU_t *cpu, const char *pfx)

{

// we'll trim to zero if we get negative time ticks,

// which has happened with some SMP kernels (pre-2.4?)

#define TRIMz(x) ((tz = (long long)(x)) < 0 ? 0 : tz)

long long u_frme, s_frme, n_frme, i_frme, w_frme, x_frme, y_frme, tot_frme, tz;

float scale;

if(cpu == NULL){

printf("NULL@\n");

return;

}

printf("u = %Lu, u_sav = %Lu\n", cpu->u, cpu->u_sav);

u_frme = cpu->u - cpu->u_sav;

s_frme = cpu->s - cpu->s_sav;

n_frme = cpu->n - cpu->n_sav;

i_frme = TRIMz(cpu->i - cpu->i_sav);

w_frme = cpu->w - cpu->w_sav;

x_frme = cpu->x - cpu->x_sav;

y_frme = cpu->y - cpu->y_sav;

tot_frme = u_frme + s_frme + n_frme + i_frme + w_frme + x_frme + y_frme;

if (tot_frme < 1) tot_frme = 1;

scale = 100.0 / (float)tot_frme;

printf("scale = %0.5f\n", scale);

// display some kinda' cpu state percentages

// (who or what is explained by the passed prefix)

printf(States_fmts,

pfx,

(float)u_frme * scale,

(float)s_frme * scale,

(float)n_frme * scale,

(float)i_frme * scale,

(float)w_frme * scale,

(float)x_frme * scale,

(float)y_frme * scale

);

// remember for next time around

cpu->u_sav = cpu->u;

cpu->s_sav = cpu->s;

cpu->n_sav = cpu->n;

cpu->i_sav = cpu->i;

cpu->w_sav = cpu->w;

cpu->x_sav = cpu->x;

cpu->y_sav = cpu->y;

#undef TRIMz

}

int main()

{

static CPU_t * smpcpu = NULL;

for(;;){

Cpu_tot = sysconf(_SC_NPROCESSORS_ONLN);

printf("CPU number: %ld\n", Cpu_tot);

smpcpu = cpus_refresh(smpcpu);

summaryhlp(&smpcpu[Cpu_tot], "Cpu(s):");

printf("\n");

sleep(3);

smpcpu = cpus_refresh(smpcpu);

summaryhlp(&smpcpu[Cpu_tot], "Cpu(s):");

printf("++++++++++++++++++++++++++\n");

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: