Linux下CPU利用率和CPU负载(附加代码实现)
第一节 CPU利用率和CPU负载在Linux/Unix下,CPU利用率(CPU utilization)分为用户态,系统态和空闲态,分别表示CPU处于用户态执行的时间,系统内核执行的时间,和空闲系统进程执行的时间。平时所说的CPU利用率是指:CPU执行非系统空闲进程的时间 / CPU总的执行时间。(上述代码中使用的方法为:1- CPU空闲运行时间/总运行时间 ,与这个计算方法原理
·
第一节 CPU利用率和CPU负载
在Linux/Unix下,CPU利用率(CPU utilization)分为用户态,系统态和空闲态,分别表示CPU处于用户态执行的时间,系统内核执行的时间,和空闲系统进程执行的时间。平时所说的CPU利用率是指:CPU执行非系统空闲进程的时间 / CPU总的执行时间。(上述代码中使用的方法为:1 - CPU空闲运行时间/总运行时间 ,与这个计算方法原理上是一样的)
在Linux的内核中,有一个全局变量:Jiffies。 Jiffies代表时间。它的单位随硬件平台的 不同而不同,系统里定义了一个常数HZ----代表每秒种最小时间间隔的数目。这样jiffies的单位就是1/HZ。Intel平台jiffies的单位是1/100秒,这就是系统所能分辨的最小时间间隔了。每个CPU时间片,Jiffies都要加1。 CPU的利用率就是用执行用户态+系统态的Jiffies除以总的Jifffies来表示。
那么,还有一个经常容易与CPU利用率(CPU utilization)混淆的词 -- CPU负载(CPU load)。CPU负载取决于CPU队列长度而不是CPU利用率,因为一个主机负载过重时,它的CPU利用率会接近100%,从而无法准确反应负载状况,而使用CPU队列长度则可以很直接反应CPU的负载量。比如说两个系统,其中一个系统有3个进程在队列中,而另一台有6个进程在队列,如果使用CPU利用率表示负载水平,他们可能都是接近100%,而使用CPU队列长度他们的负载量完全不同。
我们如何理解CPU负载?一只单核的处理器可以形象得比喻成一条单车道!那么:
*** 0.00 表示目前桥面上没有任何的车流。 实际上这种情况与 0.00 和 1.00 之间是相同的,总而言之很通畅,过往的车辆可以丝毫不用等待的通过。
*** 1.00 表示刚好是在这座桥的承受范围内。 这种情况不算糟糕,只是车流会有些堵,不过这种情况可能会造成交通越来越慢。
*** 超过 1.00,那么说明这座桥已经超出负荷,交通严重的拥堵。 那么情况有多糟糕? 例如 2.00 的情况说明车流已经超出了桥所能承受的一倍,那么将有多余过桥一倍的车辆正在焦急的等待。3.00 的话情况就更不妙了,说明这座桥基本上已经快承受不了,还有超出桥负载两倍多的车辆正在等待。
*** 1.00 表示刚好是在这座桥的承受范围内。 这种情况不算糟糕,只是车流会有些堵,不过这种情况可能会造成交通越来越慢。
*** 超过 1.00,那么说明这座桥已经超出负荷,交通严重的拥堵。 那么情况有多糟糕? 例如 2.00 的情况说明车流已经超出了桥所能承受的一倍,那么将有多余过桥一倍的车辆正在焦急的等待。3.00 的话情况就更不妙了,说明这座桥基本上已经快承受不了,还有超出桥负载两倍多的车辆正在等待。
上面的情况和处理器的负载情况非常相似。一辆汽车的过桥时间就好比是处理器处理某线程 的实际时间。Unix 系统定义的进程运行时长为所有处理器内核的处理时间加上线程 在队列中等待的时间。
和收过桥费的管理员一样,你当然希望你的汽车(操作)不会被焦急的等待。所以,理想状态 下,都希望负载平均值小于 1.00 。当然不排除部分峰值会超过 1.00,但长此以往保持这 个状态,就说明会有问题,这时候你应该会很焦急。
和收过桥费的管理员一样,你当然希望你的汽车(操作)不会被焦急的等待。所以,理想状态 下,都希望负载平均值小于 1.00 。当然不排除部分峰值会超过 1.00,但长此以往保持这 个状态,就说明会有问题,这时候你应该会很焦急。
在多处理器系统中,负载均值是基于内核的数量决定的。以 100% 负载计算,1.00 表示单个处理器,而 2.00 则说明有两个双处理器,那么 4.00 就说明主机具有四个处理器。回到我们上面有关车辆过桥的比喻。1.00 我说过是「一条单车道的道路」。那么在单车道 1.00 情况中,说明这桥梁已经被车塞满了。而在双处理器系统中,这意味着多出了一倍的 负载,也就是说还有 50% 的剩余系统资源 ---- 因为还有另外条车道可以通行。
所以,单处理器已经在负载的情况下,双处理器的负载满额的情况是 2.00,它还有一倍的资源可以利用。
实际上Linux系统中很多都是用CPU负载均值(load average)来代表当前系统的负载状况,比如使用top命令:
- long@long-Ubuntu:~$ top
- top - 20:12:45 up 3:05, 6 users, load average: 1.16, 1.27, 1.14
- Tasks: 208 total, 1 running, 206 sleeping, 0 stopped, 1 zombie
- %Cpu(s): 11.8 us, 3.7 sy, 0.0 ni, 84.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
- KiB Mem: 2067372 total, 1998832 used, 68540 free, 54104 buffers
- KiB Swap: 2095100 total, 25540 used, 2069560 free, 449612 cached
- PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- 6635 long 20 0 435m 79m 32m S 7.3 3.9 11:31.39 rhythmbox
- 4523 root 20 0 110m 61m 4804 S 5.3 3.0 8:34.14 Xorg
- 5316 long 9 -11 162m 5084 4088 S 4.3 0.2 6:01.53 pulseaudio
- 5793 long 20 0 114m 22m 13m S 4.3 1.1 0:23.38 gnome-terminal
- ……
使用“uptime”命令,效果也是类似:
- long@long-Ubuntu:~$ uptime
- 20:15:01 up 3:07, 6 users, load average: 0.43, 0.97, 1.05
事实上,这正是CPU负载所需要测量的,因为负载均值不包括那些等待I/O、网络、数据或者其他不依赖CPU的进程或线程,它关注的仅仅是积极要求CPU时间的进程或线程。这与CPU利用率是有很大不同的。
负载均值与CPU利用率在两个方面有很大的区别:
1) 负载均值用来估量CPU利用率的发展趋势,而不是某一时刻的状况
2) 负载均值包括所有CPU的需求,而不仅仅是在测量时活跃的
输出解释:
cpu usage=[(user_2 +sys_2+nice_2) - (user_1 + sys_1+nice_1)]/(total_2 - total_1)*100
3.2 使用"mpstat"命令
使用这个命令,你需要先安装sysstat工具,对于Debian或Ubuntu用户,可以通过apt-get直接安装:
$ apt-get install sysstat
使用如下命令查看CPU使用率信息:
$ mpstat
使用如下命令可以监控单独的CPU使用率信息:
$ mpstat -P ALL
3.3 使用"sar"命令
使用sar命令显示CPU使用率的语法如下:
$ sar -u 2 5 ( sar [ 选项 ] [ <时间间隔> [ <次数> ] ])
这条命令会显示2秒内的CPU使用率,总共显示5次。
3.4 使用"iostat"命令
"iostat"命令可以用来查询从系统启动以来的是CPU平均使用率以及设备或者分区的I/O状况:
$ iostat
4.5 GUI Tools 一些有图形界面的工具
KDE桌面环境有一些系统监控器一类的工具可以用来监控CPU使用率甚至更多的系统信息(比如说CPU负载状况、物理内存以及交换分区的数据占用信息),你还可以使用它来杀死一些进程。
下表总结了若干Linux下的工具:
第四节 代码实现
想获取一下目标机运行时linux系统的硬件占用情况,写了这个小程序,以后直接用了。
方法就是读取proc/stat下的文件来获取了。 cpu使用率: /proc/stat ,内存使用情况: /proc/meminfo
看程序 :
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
/***************************************************************
* @file: statusinfo.c
*
* @brief: 从linux系统获取cpu及内存使用情况
*
* @version 1.0
*
***************************************************************/
typedef struct //定义一个cpu occupy的结构体
{
char name[20]; //定义一个char类型的数组名name有20个元素
unsigned int user; //定义一个无符号的int类型的user
unsigned int nice; //定义一个无符号的int类型的nice
unsigned int system;//定义一个无符号的int类型的system
unsigned int idle; //定义一个无符号的int类型的idle
}CPU_OCCUPY;
typedef struct //定义一个mem occupy的结构体
{
char name[20]; //定义一个char类型的数组名name有20个元素
unsigned long total;
char name2[20];
unsigned long free;
}MEM_OCCUPY;
get_memoccupy (MEM_OCCUPY *mem) //对无类型get函数含有一个形参结构体类弄的指针O
{
FILE *fd;
int n;
char buff[256];
MEM_OCCUPY *m;
m=mem;
fd = fopen ("/proc/meminfo", "r");
fgets (buff, sizeof(buff), fd);
fgets (buff, sizeof(buff), fd);
fgets (buff, sizeof(buff), fd);
fgets (buff, sizeof(buff), fd);
sscanf (buff, "%s %u %s", m->name, &m->total, m->name2);
fgets (buff, sizeof(buff), fd); //从fd文件中读取长度为buff的字符串再存到起始地址为buff这个空间里
sscanf (buff, "%s %u", m->name2, &m->free, m->name2);
fclose(fd); //关闭文件fd
}
int cal_cpuoccupy (CPU_OCCUPY *o, CPU_OCCUPY *n)
{
unsigned long od, nd;
unsigned long id, sd;
float cpu_use = 0;
od = (unsigned long) (o->user + o->nice + o->system +o->idle);//第一次(用户+优先级+系统+空闲)的时间再赋给od
nd = (unsigned long) (n->user + n->nice + n->system +n->idle);//第二次(用户+优先级+系统+空闲)的时间再赋给od
id = (unsigned long) (n->user - o->user); //用户第一次和第二次的时间之差再赋给id
sd = (unsigned long) (n->system - o->system);//系统第一次和第二次的时间之差再赋给sd
if((nd-od) != 0)
cpu_use = (float)((sd+id)*100)/(nd-od); //((用户+系统)乖100)除(第一次和第二次的时间差)再赋给g_cpu_used
else cpu_use = 0;
printf("cpu: %f\n",cpu_use);
return cpu_use;
}
get_cpuoccupy (CPU_OCCUPY *cpust) //对无类型get函数含有一个形参结构体类弄的指针O
{
FILE *fd;
int n;
char buff[256];
CPU_OCCUPY *cpu_occupy;
cpu_occupy=cpust;
fd = fopen ("/proc/stat", "r");
fgets (buff, sizeof(buff), fd);
sscanf (buff, "%s %u %u %u %u", cpu_occupy->name, &cpu_occupy->user, &cpu_occupy->nice,&cpu_occupy->system, &cpu_occupy->idle);
printf("name = %s, user = %u, nice = %u, system = %u , idle = %u \n",cpu_occupy->name,cpu_occupy->user,cpu_occupy->nice,cpu_occupy->system,cpu_occupy->idle);
fclose(fd);
}
int main()
{
CPU_OCCUPY cpu_stat1;
CPU_OCCUPY cpu_stat2;
MEM_OCCUPY mem_stat;
int cpu;
//获取内存
get_memoccupy ((MEM_OCCUPY *)&mem_stat);
//第一次获取cpu使用情况
get_cpuoccupy((CPU_OCCUPY *)&cpu_stat1);
sleep(5);
//第二次获取cpu使用情况
get_cpuoccupy((CPU_OCCUPY *)&cpu_stat2);
//计算cpu使用率
cpu = cal_cpuoccupy ((CPU_OCCUPY *)&cpu_stat1, (CPU_OCCUPY *)&cpu_stat2);
return 0;
}
第二节 如何计算CPU利用率
在Linux系统中,可以用/proc/stat文件来计算cpu的利用率(详细可参考)。这个文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。
如:
- long@long-Ubuntu:~$ cat /proc/stat
- cpu 426215 701 115732 2023866 27329 4 557 0 0 0
- cpu0 218177 117 57458 1013633 8620 0 6 0 0 0
- cpu1 208038 584 58274 1010233 18709 4 550 0 0 0
- intr 21217894 119 18974 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 146350 0 647836 370 86696 3 146156 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 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 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
- ctxt 38682044
- btime 1362301653
- processes 10118
- procs_running 1
- procs_blocked 0
- softirq 11177991 0 6708342 2178 148765 86792 0 14537 1507468 29072 2680837
输出解释:
(CPU 以及CPU0、CPU1、CPU2、CPU3每行的每个参数意思(以第一行为例))
CPU时间=user+system+nice+idle+iowait+irq+softirq
“intr”这行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数。
“ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。
“btime”给出了从系统启动到现在为止的时间,单位为秒。
参数 | 解释 |
user (426215) | 从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies) ,不包含 nice值为负进程。1jiffies=0.01秒 |
nice (701) | 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies) |
system (115732) | 从系统启动开始累计到当前时刻,核心时间(单位:jiffies) |
idle (2023866) | 从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies) |
iowait (27329) | 从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies) , |
irq (4) | 从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies) |
softirq (557) | 从系统启动开始累计到当前时刻,软中断时间(单位:jiffies) |
CPU时间=user+system+nice+idle+iowait+irq+softirq
“intr”这行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数。
“ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。
“btime”给出了从系统启动到现在为止的时间,单位为秒。
“processes (total_forks) 自系统启动以来所创建的任务的个数目。
“procs_running”:当前运行队列的任务的数目。
“procs_blocked”:当前被阻塞的任务的数目。
那么CPU利用率可以使用以下两个方法。先取两个采样点,然后计算其差值:
那么CPU利用率可以使用以下两个方法。先取两个采样点,然后计算其差值:
cpu usage=(idle2-idle1)/(total_2 - total_1)*100
cpu usage=[(user_2 +sys_2+nice_2) - (user_1 + sys_1+nice_1)]/(total_2 - total_1)*100
第三节 Linux提供的一些查看系统信息的工具
使用下面这些命令我们可以查询总的CPU使用率、单独的CPU使用率(对于对称多处理机器SMP)、从你上次启动后的平均CPU使用率等。
3.1 老当益壮的top命令
使用top命令可以动态的查看CPU使用率。它会显示当前内核管理着的任务信息,它还会显示上线时间、负载均值、物理和交换内存使用状况。使用如下:
3.1 老当益壮的top命令
使用top命令可以动态的查看CPU使用率。它会显示当前内核管理着的任务信息,它还会显示上线时间、负载均值、物理和交换内存使用状况。使用如下:
$ top
按Q键推出top。
按Q键推出top。
- long@long-Ubuntu:~$ top
- top - 14:52:24 up 6:13, 5 users, load average: 1.06, 1.02, 1.24
- Tasks: 203 total, 1 running, 201 sleeping, 0 stopped, 1 zombie
- %Cpu(s): 27.5 us, 5.9 sy, 0.0 ni, 66.2 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
- KiB Mem: 2067372 total, 1808288 used, 259084 free, 41020 buffers
- KiB Swap: 2095100 total, 55040 used, 2040060 free, 539728 cached
- PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- 5740 long 20 0 110m 27m 14m S 15.2 1.4 3:13.91 gnome-terminal
- 4597 root 20 0 95000 31m 4848 S 13.9 1.6 25:29.79 Xorg
- 5297 long 20 0 246m 70m 19m S 10.3 3.5 14:09.52 compiz
3.2 使用"mpstat"命令
使用这个命令,你需要先安装sysstat工具,对于Debian或Ubuntu用户,可以通过apt-get直接安装:
$ apt-get install sysstat
使用如下命令查看CPU使用率信息:
$ mpstat
- long@long-Ubuntu:~$ mpstat
- Linux 3.7.1 (long-Ubuntu) 2013年03月04日 _i686_ (2 CPU)
- 14时53分16秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
- 14时53分16秒 all 18.91 4.92 5.15 1.00 0.00 0.04 0.00 0.00 69.99
$ mpstat -P ALL
- long@long-Ubuntu:~$ mpstat -P ALL
- Linux 3.7.1 (long-Ubuntu) 2013年03月04日 _i686_ (2 CPU)
- 14时53分53秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
- 14时53分53秒 all 18.91 4.91 5.15 0.99 0.00 0.04 0.00 0.00 70.01
- 14时53分53秒 0 19.02 4.25 5.19 0.66 0.00 0.00 0.00 0.00 70.88
- 14时53分53秒 1 18.79 5.57 5.10 1.33 0.00 0.07 0.00 0.00 69.13
3.3 使用"sar"命令
使用sar命令显示CPU使用率的语法如下:
$ sar -u 2 5 ( sar [ 选项 ] [ <时间间隔> [ <次数> ] ])
这条命令会显示2秒内的CPU使用率,总共显示5次。
- long@long-Ubuntu:~$ sar -u 2 5
- Linux 3.7.1 (long-Ubuntu) 2013年03月04日 _i686_ (2 CPU)
- 14时54分22秒 CPU %user %nice %system %iowait %steal %idle
- 14时54分24秒 all 5.51 0.00 1.50 1.00 0.00 91.98
- 14时54分26秒 all 4.52 0.00 1.26 0.00 0.00 94.22
- 14时54分28秒 all 4.02 0.00 1.76 0.00 0.00 94.22
- 14时54分30秒 all 4.77 0.00 1.51 3.77 0.00 89.95
- 14时54分32秒 all 3.77 0.00 1.51 0.00 0.00 94.72
- 平均时间: all 4.52 0.00 1.51 0.95 0.00 93.02
3.4 使用"iostat"命令
"iostat"命令可以用来查询从系统启动以来的是CPU平均使用率以及设备或者分区的I/O状况:
$ iostat
- long@long-Ubuntu:~$ iostat
- Linux 3.7.1 (long-Ubuntu) 2013年03月04日 _i686_ (2 CPU)
- avg-cpu: %user %nice %system %iowait %steal %idle
- 18.89 4.90 5.18 0.99 0.00 70.04
- Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
- sda 6.75 67.08 58.24 1512659 1313268
4.5 GUI Tools 一些有图形界面的工具
KDE桌面环境有一些系统监控器一类的工具可以用来监控CPU使用率甚至更多的系统信息(比如说CPU负载状况、物理内存以及交换分区的数据占用信息),你还可以使用它来杀死一些进程。
下表总结了若干Linux下的工具:
工具 | 简单介绍 |
top | 查看进程活动状态以及一些系统状况 |
vmstat | 查看系统状态、硬件和系统信息等 |
iostat | 查看CPU 负载,硬盘状况 |
sar | 综合工具,查看系统状况 |
mpstat | 查看多处理器状况 |
netstat | 查看网络状况 |
iptraf | 实时网络状况监测 |
tcpdump | 抓取网络数据包,详细分析 |
mpstat | 查看多处理器状况 |
tcptrace | 数据包分析工具 |
netperf | 网络带宽工具 |
dstat | 综合工具,综合了 vmstat, iostat, ifstat, netstat 等多个信息 |
第四节 代码实现
想获取一下目标机运行时linux系统的硬件占用情况,写了这个小程序,以后直接用了。
方法就是读取proc/stat下的文件来获取了。 cpu使用率: /proc/stat ,内存使用情况: /proc/meminfo
看程序 :
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
/***************************************************************
* @file: statusinfo.c
*
* @brief: 从linux系统获取cpu及内存使用情况
*
* @version 1.0
*
***************************************************************/
typedef struct //定义一个cpu occupy的结构体
{
char name[20]; //定义一个char类型的数组名name有20个元素
unsigned int user; //定义一个无符号的int类型的user
unsigned int nice; //定义一个无符号的int类型的nice
unsigned int system;//定义一个无符号的int类型的system
unsigned int idle; //定义一个无符号的int类型的idle
}CPU_OCCUPY;
typedef struct //定义一个mem occupy的结构体
{
char name[20]; //定义一个char类型的数组名name有20个元素
unsigned long total;
char name2[20];
unsigned long free;
}MEM_OCCUPY;
get_memoccupy (MEM_OCCUPY *mem) //对无类型get函数含有一个形参结构体类弄的指针O
{
FILE *fd;
int n;
char buff[256];
MEM_OCCUPY *m;
m=mem;
fd = fopen ("/proc/meminfo", "r");
fgets (buff, sizeof(buff), fd);
fgets (buff, sizeof(buff), fd);
fgets (buff, sizeof(buff), fd);
fgets (buff, sizeof(buff), fd);
sscanf (buff, "%s %u %s", m->name, &m->total, m->name2);
fgets (buff, sizeof(buff), fd); //从fd文件中读取长度为buff的字符串再存到起始地址为buff这个空间里
sscanf (buff, "%s %u", m->name2, &m->free, m->name2);
fclose(fd); //关闭文件fd
}
int cal_cpuoccupy (CPU_OCCUPY *o, CPU_OCCUPY *n)
{
unsigned long od, nd;
unsigned long id, sd;
float cpu_use = 0;
od = (unsigned long) (o->user + o->nice + o->system +o->idle);//第一次(用户+优先级+系统+空闲)的时间再赋给od
nd = (unsigned long) (n->user + n->nice + n->system +n->idle);//第二次(用户+优先级+系统+空闲)的时间再赋给od
id = (unsigned long) (n->user - o->user); //用户第一次和第二次的时间之差再赋给id
sd = (unsigned long) (n->system - o->system);//系统第一次和第二次的时间之差再赋给sd
if((nd-od) != 0)
cpu_use = (float)((sd+id)*100)/(nd-od); //((用户+系统)乖100)除(第一次和第二次的时间差)再赋给g_cpu_used
else cpu_use = 0;
printf("cpu: %f\n",cpu_use);
return cpu_use;
}
get_cpuoccupy (CPU_OCCUPY *cpust) //对无类型get函数含有一个形参结构体类弄的指针O
{
FILE *fd;
int n;
char buff[256];
CPU_OCCUPY *cpu_occupy;
cpu_occupy=cpust;
fd = fopen ("/proc/stat", "r");
fgets (buff, sizeof(buff), fd);
sscanf (buff, "%s %u %u %u %u", cpu_occupy->name, &cpu_occupy->user, &cpu_occupy->nice,&cpu_occupy->system, &cpu_occupy->idle);
printf("name = %s, user = %u, nice = %u, system = %u , idle = %u \n",cpu_occupy->name,cpu_occupy->user,cpu_occupy->nice,cpu_occupy->system,cpu_occupy->idle);
fclose(fd);
}
int main()
{
CPU_OCCUPY cpu_stat1;
CPU_OCCUPY cpu_stat2;
MEM_OCCUPY mem_stat;
int cpu;
//获取内存
get_memoccupy ((MEM_OCCUPY *)&mem_stat);
//第一次获取cpu使用情况
get_cpuoccupy((CPU_OCCUPY *)&cpu_stat1);
sleep(5);
//第二次获取cpu使用情况
get_cpuoccupy((CPU_OCCUPY *)&cpu_stat2);
//计算cpu使用率
cpu = cal_cpuoccupy ((CPU_OCCUPY *)&cpu_stat1, (CPU_OCCUPY *)&cpu_stat2);
return 0;
}
更多推荐
已为社区贡献3条内容
所有评论(0)