您的位置 首页 应用

linux下怎么获取cpu的利用率

linux下如何获取cpu的利用率-“proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。”

  “proc文件体系是一个伪文件体系,它只存在内存傍边,而不占用外存空间。它以文件体系的办法为拜访体系内核数据的操作供给接口。用户和应用程序能够经过proc得到体系的信息,并能够改动内核的某些参数。”

  这儿将介绍怎么从/proc文件体系中获取与防火墙相关的一些功能参数,以及怎么经过/proc文件体系修正内核的相关装备。

  1、从/proc文件体系获取相关的功能参数

  cpu运用率: /proc/stat

  内存运用状况: /proc/meminfo

  网络负载信息: /proc/net/dev

  相应的核算办法:(摘自:什么是proc文件体系,见参考资料)

  (1) 处理器运用率

  (2) 内存运用率

  (3) 流入流出数据包

  (4) 全体网络负载

  这些数据别离要从/proc/stat、/proc/net/dev、/proc/meminfo三个文件中提取。如里有问题或对要提取的数据不太清楚,能够运用man proc来检查proc文件体系的联机手册。

  (1) 处理器运用率

  这儿要从/proc/stat中提取四个数据:用户形式(user)、低优先级的用户形式(nice)、内核形式(system)以及闲暇的处理器时刻(idle)。它们均坐落/proc/stat文件的榜首行。CPU的使用率运用如下公式来核算。

  CPU使用率 = 100 *(user + nice + system)/(user + nice + system + idle)

  (2) 内存运用率

  这儿需求从/proc/meminfo文件中提取两个数据,当时内存的运用量(cmem)以及内存总量(amem)。

  内存运用百分比 = 100 * (cmem / umem)

  (3)网络使用率

  为了得到网络使用率的相关数据,需求从/proc/net/dev文件中取得两个数据:从本机输出的数据包数,流入本机的数据包数。它们都坐落这个文件的第四行。

  功能搜集程序开端记载下这两个数据的初始值,今后每次取得这个值后均减去这个初始值即为从集群发动开端从本节点经过的数据包。

  使用上述数据核算出网络的均匀负载,办法如下:

  均匀网络负载 = (输出的数据包+流入的数据包) / 2

  2. 经过/proc文件体系调整相关的内核装备

  答应ip转发 /proc/sys/net/ipv4/ip_forward

  制止ping /proc/sys/net/ipv4/icmp_echo_ignore_all

  能够在命令行下直接往上述两个“文件”里头写入“1”来完成相关装备,假如写入“0”将撤销相关装备。不过在体系重启今后,这些装备将康复默认设置,所以,假如想让这些修正收效,能够把下面的装备直接写入/etc/profile文件,或许其他随体系发动而履行的程序文件中。

  echo 1 》 /proc/sys/net/ipv4/ip_forward

  echo 1 》 /proc/sys/net/ipv4/icmp_echo_ignore_all

  这儿核算cpu运用率是有问题的,需求运用上一状况的值来核算

  正确的核算办法是,等上一个时刻:

  1、记载某个时刻cpu的运用状况

  2、等上一个时刻段

  3、再记载此时的cpu运用状况

  4、核算总的时刻片

  把榜首次的一切cpu运用状况求和,得到j1

  把第2次的一切cpu运用状况求和,得到j2

  j2-j1得到这个时刻段的一切时刻片

  即total=j2-j1=第2次的一切列的和-榜首次的一切列的和

  5、核算idle时刻

  idle对应第五列的数据,用第2次的减去榜首次的即可

  idle=第2次的第五列-榜首次的第五列

  6、核算cpu运用率

  rate=(total-idle)/total

  在Linux/Unix下,CPU使用率分为用户态 ,体系态 和闲暇态 ,别离表明CPU处于用户态履行的时刻,体系内核履行的时刻,和闲暇体系进程履行的时刻。平常所说的CPU使用率是指:CPU履行非体系闲暇进程的时刻 / CPU总的履行时刻 。

  linux c程序获取cpu运用率及内存运用状况

  2009-05-17 23:10

  想获取一下方针机运行时linux体系的硬件占用状况,写了这几个小程序,今后直接用了。

  办法便是读取proc下的文件来获取了。 cpu运用率: /proc/stat ,内存运用状况: /proc/meminfo

  看程序 :

  /***************************************************************

  * @file: statusinfo.c

  *

  * @brief: 从linux体系获取cpu及内存运用状况

  *

  * @version 1.0

  *

  ***************************************************************/

  typedef struct PACKED //界说一个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 PACKED //界说一个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;

  int 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);//第2次(用户+优先级+体系+闲暇)的时刻再赋给od

  id = (unsigned long) (n-》user – o-》user); //用户榜首次和第2次的时刻之差再赋给id

  sd = (unsigned long) (n-》system – o-》system);//体系榜首次和第2次的时刻之差再赋给sd

  if((nd-od) != 0)

  cpu_use = (int)((sd+id)*10000)/(nd-od); //((用户+体系)乖100)除(榜首次和第2次的时刻差)再赋给g_cpu_used

  else cpu_use = 0;

  //printf(“cpu: %u/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);

  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(10);

  //第2次获取cpu运用状况

  get_cpuoccupy((CPU_OCCUPY *)&cpu_stat2);

  //核算cpu运用率

  cpu = cal_cpuoccupy ((CPU_OCCUPY *)&cpu_stat1, (CPU_OCCUPY *)&cpu_stat2);

  return 0;

  }

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/89654.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部