编程中怎么获取linux的linux 多核cpu使用率率

标签:至少1个,最多5个
在Linux下面,可以通过top命令看到CPU的负载情况,其输出大概如下(只摘录CPU部分):
top - 01:24:41 up 6 min,
load average: 0.00, 0.03, 0.00
3.1 ni, 90.5 id,
这里的load average以及缩写的us、sy、ni、id、wa、hi、si、st都是些什么意思呢?这些值在一个什么样的区间比较合理呢?如果值超过了合理区间,应该怎么处理呢?这篇将来聊聊这些问题。
load average
load average代表CPU的平均负载值,上面示例中的load average: 0.00, 0.03, 0.00分别表示当前CPU在1分钟、5分钟和15分钟内的平均负载。这些负载值是怎么来的呢?
这些数据来自于文件/proc/loadavg,内核会负责统计出这些数据。
top和uptime命令显示的内容就来自于这个文件,那么这里所谓的平均负载是个什么概念? 根据proc的可知,这里的值就是单位时间内处于运行状态以及等待disk I/O状态的平均job数量。这里的运行状态和job都是内核的概念,这里简单澄清一下:
对内核来说,进程和线程都是job
job处于运行状态指job处于内核的运行队列中,正在或等待被CPU调度(用户空间的进程正在运行不代表需要被CPU调度,有可能在等待I/O,也有可能在sleep等等)
因为某一刻(瞬间)等待调度的进程多少并不能反映系统的整体压力,所以这里取了1,5和15分钟的平均值。
那么这个值的大小反映系统什么样的一个压力状态呢?这里以单核CPU为例
小于1: 说明平均每次只有不到一个job在忙,对于单核的CPU来说,完全能处理过来
等于1: 说明平均每次刚好有一个job在忙,对于单核的CPU来说,刚好能处理过来
大于1: 说明平均每次有多于一个job在忙,对于单核的CPU来说,由于一次只能处理一个任务,所以肯定有任务在等待,说明系统负载较大,调度不过来,有job需要等待
从上面可以看出,一旦大于1,就说明job得不到及时调度,系统性能将受影响。对于多核来说,由于一次可以调度多个job,所以大于1不一定有问题,以4核CPU为例,该值大于4才说明CPU忙不过来。
那这个平均负载保持在多少比较合适呢?其实没有一个标准值,但一般的做法是预留一定的空间来应对系统负载的波动,建议控制在“0.7*核数”以内,比如4核,那么0.7*4=2.8比较合适,一旦超过这个值,需要分析原因并着手解决。
load average通过统计等待运行的平均job数量来推断CPU的繁忙程度,而%Cpu(s)则直接统计CPU处于不同状态的时间,比上面的load average更直观,所以在实际上也被使用的更多。
总体来说,CPU会处于下面三种状态中的一种:
Idle: 处于空闲状态,没有任务需要调度
User space: 正在运行user space的代码(处于用户态)
Kernel: 正在运行内核的代码(处于内核态)
对上面这三种状态,内核又进一步细分为很多状态,这里以上面输出的8种状态为例进行说明:
2.5 us : 表示CPU有2.5%的时间在运行用户态代码(即在运行用户态程序)
1.8 sy : 表示CPU有1.8%的时间在运行内核态代码。内核负责管理系统的所有进程和硬件资源,所有的内核代码都运行在内核态,当用户态进程需要访问硬件资源时,如分配内存,读写I/O等,也需要通过系统调用进入内核态运行内核代码。%sy高说明内核占用太多资源,或者用户进程发起了太多的系统调用。
3.1 ni : 表示CPU有3.1%的时间在运行niceness不为0的进程代码。默认情况下,进程的niceness值都为0,但可以通过命令来启动一个进程并指定其niceness值,niceness的取值范围是-20到19,值越小,表示优先级越高,越优先被内核调度。
90.5 id : 表示CPU有90.5%的时间处于空闲状态
1.7 wa : 表示CPU有1.7%的时间处于I/O等待状态。通常情况下,当CPU遇到一个I/O操作时,会先触发I/O操作,然后去干别的,等I/O操作完成后,CPU再接着继续工作,但如果这时系统比较空闲,CPU没有别的事情可以做,那么CPU将处于等待状态,这种处于等待状态的时间将会被统计进I/O wait,也就是说CPU处于I/O wait状态即CPU闲着没事干在等I/O操作结束,和idle几乎是一样的。这个值高说明CPU闲且I/O操作多或者I/O操作慢,但低并不能说明没有I/O操作或者I/O操作快,有可能是CPU在忙别的,所以这只是一个参考值,需要和其他的统计项一起来分析。
0.0 hi & 0.4 si : 这两个值反映了CPU有多少时间花在了中断处理上,hi(hardware interrupts)是硬件中断,si(softirqs)是软件中断。硬件中断一般由I/O设备引起,如网卡、磁盘等,发生硬件中断后,CPU需要立即处理,当硬件中断中需要处理的事情很多时,内核会生成相应的软中断,然后将耗时且不需要立即处理完成的操作放在软中断中执行,比如当网卡收到网络包时,需要CPU立即把数据拷贝到内存中去,因为网卡自带的缓存较小,如果不及时处理的话后面的数据包就进不来,导致丢包,当数据拷贝到内存中之后,就不需要那么着急的处理了,这时候可以将处理数据包(协议栈)的代码放在软中断中执行。本人不是内核专家,关于软中断的部分请参考
0.0 st : %st和虚拟机有关,当系统运行在虚拟机中时,当前虚拟机就会和宿主机以及其它的虚拟机共享CPU,%st就表示当前虚拟机在等待CPU为它服务的时间。该值越大,表示物理CPU被宿主机和其它虚拟机占用的时间越长,导致当前虚拟机得不到充足的CPU资源。如果%st长时间大于0,说明CPU资源得不到满足,这时可以考虑将虚拟机移到其它机器上,或者减少当前机器运行的虚拟机数量。
上面这些统计项的总和等于100%,除了%idle之外,其它的任何一项数值过高都代表系统有问题,需要具体问题具体分析。
%us过高 : 表示有用户态进程占用了过多的CPU,通过top命令可以很清楚的看到是哪个进程,如果这不是预期的行为,可以通过kill命令杀死相应的进程或者重启它
%sy过高 : 如果只是偶尔过高的话,不用担心,但如果是持续走高的话,就需要重视,有可能是某些进程的系统调用太频繁,比如进程不停的往控制台输出日志,但如果用户态的进程都没有问题,那可能是内核里面的代码出现了问题,尤其是代码写的不好的驱动模块
%ni过高 : 说明有人用nice程序运行了比较耗CPU的进程。如果niceness值大于0的话,就没什么好担心的,因为它的优先级比默认优先级要低,不会影响CPU性能,但最好还是确认一下该进程不会抢占系统的其它资源,如内存、磁盘I/O等,避免对系统整体性能造成影响。如果niceness值小于0的话,表示该进程优先级高且占用CPU资源多,需要确保该进程占用的CPU资源是符合预期的,如果不是,可以用top命令把它找出来并kill掉或者重启。
%wa过高 : 意味着系统中有进程在做大量的I/O操作,或者在读写速度比较慢的I/O设备,比如频繁的读写磁盘,这时可以通过命令来查看是哪些进程占I/O,然后再针对不同的进程做相应的处理;还有一种情况就是系统在频繁的使用交换分区,这时需要解决的就是内存的问题,而不是I/O的问题。
%hi或者%si过高 : %hi过高一般是硬件出问题了,%si过高一般是内核里面的代码出问题了
%st 过高 : 正如上面介绍介绍的那样,%st过高表示当前虚拟机得不到足够的CPU资源。这时可以考虑将当前虚拟机搬迁到其它的主机上,或者想办法降低当前主机的负载,比如关掉一些其它的虚拟机。
load average和%Cpu(s)以不同的方式给出了当前主机的CPU负载情况,通过%Cpu(s)我们可以看到系统当前的实时负载,现在很多监控系统每隔一段时间都会采集一次%Cpu(s),然后存储起来以图形的方式展示出来,这样就能很直观的看到CPU负载的变化,当然如果没有这样的监控系统的话,通过load average也能大概的知道最近一段时间内的平均负载(最长15分钟)。
1 收藏&&|&&1
你可能感兴趣的文章
2 收藏,1.7k
本作品采用 署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可
分享到微博?
技术专栏,帮你记录编程中的点滴,提升你对技术的理解收藏感兴趣的文章,丰富自己的知识库
明天提醒我
我要该,理由是:
扫扫下载 Applinux&c程序获取cpu使用率及内存使用情况&(转载)
想获取一下目标机运行时linux系统的硬件占用情况,写了这几个小程序,以后直接用了。
方法就是读取proc下的文件来获取了。&cpu使用率:&&&&/proc/stat&,内存使用情况:&&&&&&/proc/meminfo
typedef&struct&PACKED&&&&&&&&&//定义一个cpu&occupy的结构体
char&name[20];&&&&&&//定义一个char类型的数组名name有20个元素
unsigned&int&&//定义一个无符号的int类型的user
unsigned&int&&//定义一个无符号的int类型的nice
unsigned&int&//定义一个无符号的int类型的system
unsigned&int&&//定义一个无符号的int类型的idle
}CPU_OCCUPY;
typedef&struct&PACKED&&&&&&&&&//定义一个mem&occupy的结构体
char&name[20];&&&&&&//定义一个char类型的数组名name有20个元素
unsigned&long&&
char&name2[20];
unsigned&long&&&&&&&&&&&&&&&&&&&&&&&&
}MEM_OCCUPY;
get_memoccupy&(MEM_OCCUPY&*mem)&//对无类型get函数含有一个形参结构体类弄的指针O
&&&&FILE&*&&&&&&&&&&
&&&&int&n;&&&&&&&&&&&&&
&&&&char&buff[256];&&&
&&&&MEM_OCCUPY&*m;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&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,&&&&&
&&&&unsigned&long&id,&
&&&&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);//第二次(用户+优先级+系统+空闲)的时间再赋给od
&&&&id&=&(unsigned&long)&(n-&user&-&o-&user);&&&&//用户第一次和第二次的时间之差再赋给id
&&&&sd&=&(unsigned&long)&(n-&system&-&o-&system);//系统第一次和第二次的时间之差再赋给sd
&&&&if((nd-od)&!=&0)
&&&&cpu_use&=&(int)((sd+id)*10000)/(nd-od);&//((用户+系统)乖100)除(第一次和第二次的时间差)再赋给g_cpu_used
&&&&else&cpu_use&=&0;
&&&&//printf("cpu:&%u/n",cpu_use);
&&&&return&cpu_
get_cpuoccupy&(CPU_OCCUPY&*cpust)&//对无类型get函数含有一个形参结构体类弄的指针O
&&&&FILE&*&&&&&&&&&
&&&&int&n;&&&&&&&&&&&&
&&&&char&buff[256];&
&&&&CPU_OCCUPY&*cpu_
&&&&cpu_occupy=
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&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_
&&&&//获取内存
&&&&get_memoccupy&((MEM_OCCUPY&*)&mem_stat);
&&&&//第一次获取cpu使用情况
&&&&get_cpuoccupy((CPU_OCCUPY&*)&cpu_stat1);
&&&&sleep(10);
&&&&//第二次获取cpu使用情况
&&&&get_cpuoccupy((CPU_OCCUPY&*)&cpu_stat2);
&&&&//计算cpu使用率
&&&&cpu&=&cal_cpuoccupy&((CPU_OCCUPY&*)&cpu_stat1,&(CPU_OCCUPY&*)&cpu_stat2);
&&&&return&0;
想获取一下目标机运行时linux系统的硬件占用情况,写了这几个小程序,以后直接用了。
方法就是读取proc下的文件来获取了。&cpu使用率:&&&&/proc/stat&,内存使用情况:&&&&&&/proc/meminfo
typedef&struct&PACKED&&&&&&&&&//定义一个cpu&occupy的结构体
char&name[20];&&&&&&//定义一个char类型的数组名name有20个元素
unsigned&int&&//定义一个无符号的int类型的user
unsigned&int&&//定义一个无符号的int类型的nice
unsigned&int&//定义一个无符号的int类型的system
unsigned&int&&//定义一个无符号的int类型的idle
}CPU_OCCUPY;
typedef&struct&PACKED&&&&&&&&&//定义一个mem&occupy的结构体
char&name[20];&&&&&&//定义一个char类型的数组名name有20个元素
unsigned&long&&
char&name2[20];
unsigned&long&&&&&&&&&&&&&&&&&&&&&&&&
}MEM_OCCUPY;
get_memoccupy&(MEM_OCCUPY&*mem)&//对无类型get函数含有一个形参结构体类弄的指针O
&&&&FILE&*&&&&&&&&&&
&&&&int&n;&&&&&&&&&&&&&
&&&&char&buff[256];&&&
&&&&MEM_OCCUPY&*m;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&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,&&&&&
&&&&unsigned&long&id,&
&&&&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);//第二次(用户+优先级+系统+空闲)的时间再赋给od
&&&&id&=&(unsigned&long)&(n-&user&-&o-&user);&&&&//用户第一次和第二次的时间之差再赋给id
&&&&sd&=&(unsigned&long)&(n-&system&-&o-&system);//系统第一次和第二次的时间之差再赋给sd
&&&&if((nd-od)&!=&0)
&&&&cpu_use&=&(int)((sd+id)*10000)/(nd-od);&//((用户+系统)乖100)除(第一次和第二次的时间差)再赋给g_cpu_used
&&&&else&cpu_use&=&0;
&&&&//printf("cpu:&%u/n",cpu_use);
&&&&return&cpu_
get_cpuoccupy&(CPU_OCCUPY&*cpust)&//对无类型get函数含有一个形参结构体类弄的指针O
&&&&FILE&*&&&&&&&&&
&&&&int&n;&&&&&&&&&&&&
&&&&char&buff[256];&
&&&&CPU_OCCUPY&*cpu_
&&&&cpu_occupy=
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&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_
&&&&//获取内存
&&&&get_memoccupy&((MEM_OCCUPY&*)&mem_stat);
&&&&//第一次获取cpu使用情况
&&&&get_cpuoccupy((CPU_OCCUPY&*)&cpu_stat1);
&&&&sleep(10);
&&&&//第二次获取cpu使用情况
&&&&get_cpuoccupy((CPU_OCCUPY&*)&cpu_stat2);
&&&&//计算cpu使用率
&&&&cpu&=&cal_cpuoccupy&((CPU_OCCUPY&*)&cpu_stat1,&(CPU_OCCUPY&*)&cpu_stat2);
&&&&return&0;
我们在搞性能测试的时候,对后台服务器的CPU利用率监控是一个常用的手段。服务器的CPU利用率高,则表明服务器很繁忙。如果前台响应时间越来越大,而后台CPU利用率始终上不去,说明在某个地方有瓶颈了,系统需要调优。这个是即使不懂技术的人都容易理解的事情。
上面理解对吗?我个人觉得不十分准确。这个要看后台你测试的进程是什么类型的。如果是计算密集型的进程,当前端压力越来越大的时候,很容易把CPU&利用率打上去。但是如果是I/O网络密集型的进程,即使客户端的请求越来越多,但是服务器CPU不一定能上去,这个是你要测试的进程的自然属性决定的。比较常见的就是,大文件频繁读写的cpu开销远小于小文件频繁读写的开销。因为在I/O吞吐量一定时,小文件的读写更加频繁,需要更多的cpu来处理I/O&的中断。
在Linux/Unix下,CPU利用率分为用户态,系统态和空闲态,分别表示CPU处于用户态执行的时间,系统内核执行的时间,和空闲系统进程执行的时间。平时所说的CPU利用率是指:CPU执行非系统空闲进程的时间&/&CPU总的执行时间。
在Linux的内核中,有一个全局变量:Jiffies。&Jiffies代表时间。它的单位随硬件平台的不同而不同。系统里定义了一个常数HZ,代表每秒种最小时间间隔的数目。这样jiffies的单位就是&1/HZ。Intel平台jiffies的单位是1/100秒,这就是系统所能分辨的最小时间间隔了。每个CPU时间片,Jiffies都要加1。&CPU的利用率就是用执行用户态+系统态的Jiffies除以总的Jifffies来表示。
在Linux系统中,可以用/proc/stat文件来计算cpu的利用率(详细的解释可参考:http:&//
[sailorhzr@builder&~]$&cat&/proc/stat&&
cpu&432661&13295&86656&&171474&233&5346&
cpu0&123075&2462&23494&&16586&0&4615&
cpu1&111917&4124&23858&&69697&123&371&
cpu2&103164&3554&21530&&64032&106&334&
cpu3&94504&3153&17772&&21158&4&24&
intr&&&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&
processes&270014&
procs_running&1&
procs_blocked&0&&&
CPU&以及CPU0、CPU1、CPU2、CPU3每行的每个参数意思(以第一行为例)为:
user&(432661)&
nice&(13295)&
system&(86656)&
iowait&(171474)&
irq&(233)&
softirq&(5346)&
从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies)&,不包含&nice值为负进程。1jiffies=0.01秒
从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies)
从系统启动开始累计到当前时刻,核心时间(单位:jiffies)
从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies)
从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies)&,
从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies)
从系统启动开始累计到当前时刻,软中断时间(单位:jiffies)&
CPU时间=user+system+nice+idle+iowait+irq+softirq
“intr”这行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数。
“ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。
“btime”给出了从系统启动到现在为止的时间,单位为秒。
“processes&(total_forks)&自系统启动以来所创建的任务的个数目。
“procs_running”:当前运行队列的任务的数目。
“procs_blocked”:当前被阻塞的任务的数目。
那么CPU利用率可以使用以下两个方法。先取两个采样点,然后计算其差值:
cpu&usage=(idle2-idle1)/(cpu2-cpu1)*100&
cpu&usage=[(user_2&+sys_2+nice_2)&-&(user_1&+&sys_1+nice_1)]/(total_2&-&total_1)*100&
以下用分别用bash和perl做的一个cpu利用率的计算:
本人注:以下代码则采用公式为:
total_0USER[0]+NICE[0]+SYSTEM[0]+IDLE[0]+IOWAIT[0]+IRQ[0]+SOFTIRQ[0]&&
total_1=USER[1]+NICE[1]+SYSTEM[1]+IDLE[1]+IOWAIT[1]+IRQ[1]+SOFTIRQ[1]&&
cpu&usage=(IDLE[0]-IDLE[1])&/&(total_0-total_1)&*&100&
###bash&代码
CODE:#!/bin/sh&&
##echo&user&nice&system&idle&iowait&irq&softirq&&
CPULOG_1=$(cat&/proc/stat&|&grep&'cpu&'&|&awk&'{print&$2"&"$3"&"$4"&"$5"&"$6"&"$7"&"$8}')&&
SYS_IDLE_1=$(echo&$CPULOG_1&|&awk&'{print&$4}')&&
Total_1=$(echo&$CPULOG_1&|&awk&'{print&$1+$2+$3+$4+$5+$6+$7}')&&
CPULOG_2=$(cat&/proc/stat&|&grep&'cpu&'&|&awk&'{print&$2"&"$3"&"$4"&"$5"&"$6"&"$7"&"$8}')&&
SYS_IDLE_2=$(echo&$CPULOG_2&|&awk&'{print&$4}')&&
Total_2=$(echo&$CPULOG_2&|&awk&'{print&$1+$2+$3+$4+$5+$6+$7}')&&
SYS_IDLE=`expr&$SYS_IDLE_2&-&$SYS_IDLE_1`&&
Total=`expr&$Total_2&-&$Total_1`&&
SYS_USAGE=`expr&$SYS_IDLE/$Total*100&|bc&-l`&&
SYS_Rate=`expr&100-$SYS_USAGE&|bc&-l`&&
Disp_SYS_Rate=`expr&"scale=3;&$SYS_Rate/1"&|bc`&&
echo&$Disp_SYS_Rate%&&
###perl&代码
#!/usr/bin/perl&&
$SLEEPTIME=5;&&
if&(-e&"/tmp/stat")&{&&
unlink&"/tmp/stat";&&
open&(JIFF_TMP,&"&&/tmp/stat")&||&die&"Can't&open&/proc/stat&file!/n";&&
open&(JIFF,&"/proc/stat")&||&die&"Can't&open&/proc/stat&file!/n";&&
@jiff_0=;&&
print&JIFF_TMP&$jiff_0[0]&;&&
close&(JIFF);&&
sleep&$SLEEPTIME;&&
open&(JIFF,&"/proc/stat")&||&die&"Can't&open&/proc/stat&file!/n";&&
@jiff_1=;&&
print&JIFF_TMP&$jiff_1[0];&&
close&(JIFF);&&
close&(JIFF_TMP);&&
@USER=`awk&'{print&/$2}'&"/tmp/stat"`;&&
@NICE=`awk&'{print&/$3}'&"/tmp/stat"`;&&
@SYSTEM=`awk&'{print&/$4}'&"/tmp/stat"`;&&
@IDLE=`awk&'{print&/$5}'&"/tmp/stat"`;&&
@IOWAIT=`awk&'{print&/$6}'&"/tmp/stat"`;&&
@IRQ=`awk&'{print&/$7}'&"/tmp/stat"`;&&
@SOFTIRQ=`awk&'{print&/$8}'&"/tmp/stat"`;&&
$JIFF_0=$USER[0]+$NICE[0]+$SYSTEM[0]+$IDLE[0]+$IOWAIT[0]+$IRQ[0]+$SOFTIRQ[0];&&
$JIFF_1=$USER[1]+$NICE[1]+$SYSTEM[1]+$IDLE[1]+$IOWAIT[1]+$IRQ[1]+$SOFTIRQ[1];&&
$SYS_IDLE=($IDLE[0]-$IDLE[1])&/&($JIFF_0-$JIFF_1)&*&100;&&
$SYS_USAGE=100&-&$SYS_IDLE;&&
printf&("The&CPU&usage&is&%1.2f%%/n",$SYS_USAGE);
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 11, 距离下一级还需 189 积分
论坛徽章:0
请问怎样在linux下得到cpu使用率?用C++,还有mem使用率
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
稍有积蓄, 积分 337, 距离下一级还需 163 积分
论坛徽章:0
请问怎样在linux下得到cpu使用率?用C++
翻翻以前的帖子,这方面的内容不少
小富即安, 积分 3780, 距离下一级还需 1220 积分
论坛徽章:0
请问怎样在linux下得到cpu使用率?用C++
我想得到当前进程所用的CPU时间,怎么做呢.
进程环境里可以获取吗
家境小康, 积分 1147, 距离下一级还需 853 积分
论坛徽章:0
请问怎样在linux下得到cpu使用率?用C++
man getrusage
论坛徽章:0
请问怎样在linux下得到cpu使用率?用C++
这里的精华有
没有找到可以去
www.oldlinux.org看看
那个是研究linux怎么写的论坛
白手起家, 积分 11, 距离下一级还需 189 积分
论坛徽章:0
请问怎样在linux下得到cpu使用率?用C++
拜托给点建设性意见啊,最好直接有代码。
有谁能看懂/proc/stat&&? 里面有cpu占用率。
小富即安, 积分 3780, 距离下一级还需 1220 积分
论坛徽章:0
请问怎样在linux下得到cpu使用率?用C++
[quote]原帖由 &renstone921&]man getrusage[/quote 发表:
#include &sys/time.h&;
#include &sys/resource.h&;
#include &unistd.h&;
#include &stdio.h&;
int main()
{
& && && &
& && && &
& && && &struct rlimit dec1;
& && && &rc =&&getrusage (RUSAGE_SELF,&dec); /*RUASGE_SELF defined in sys/resource.h*/
& && && &printf(&The user time is: %d\n&,dec.ru_utime.tv_sec);
& && && &printf(&The system_time is: %d\n&,dec.ru_stime.tv_sec);
& && && &rc = getrlimit (RLIMIT_CPU,&dec1);
& && && &printf(&The current cuptime:%d\n&,dec1.rlim_cur);
& && && &printf(&The max cuptime:%d\n&,dec1.rlim_max);
& && &&&return 0;
}
复制代码
我参考man写了这个,结果前两个输出是0.后两个输出都是一个很长的数字.
bash-3.00$ ./a.out
The user time is: 0
The system_time is: 0
The current cuptime:
The max cuptime:
复制代码
家境小康, 积分 1147, 距离下一级还需 853 积分
论坛徽章:0
请问怎样在linux下得到cpu使用率?用C++
为了防止时间太短,随便写入一个文件.
时间应当是一个差值,而不是一个时刻.
下面的数字都是按照微秒给出的.
#include &sys/time.h&;
#include &sys/resource.h&;
#include &unistd.h&;
#include &stdio.h&;
int main()
& & & & & & & &
& & & & & & & & double userT
& & & & & & & & double kernelT
& & & & & & & & FILE*
& & & & & & & & file = fopen(&dat&, &a+&);
& & & & & & & &
& && &&&getrusage (RUSAGE_SELF,&start); /*RUASGE_SELF defined in sys/resource.h*/
& & & & & & & & if (NULL != file)
& & & & & & & & {
& & & & & & & & & & & & for (i = 0; i &
; i++)
& & & & & & & & & & & & & & & & fprintf(file, &%4d&,&&i);
& & & & & & & & }
& & & & & & & & getrusage(RUSAGE_SELF, &end);
& && &&&
& & & & & & & & userTime = (end.ru_utime.tv_sec - start.ru_utime.tv_sec) *&&1.0e6 + (end.ru_utime.tv_usec - start.ru_utime.tv_usec) ;
& & & & & & & & kernelTime = (end.ru_stime.tv_sec - start.ru_stime.tv_sec) * 1.0e6 + (end.ru_stime.tv_usec - start.ru_stime.tv_usec);
& & & & & & & &
& & & & & & & & printf(&%e\n&, userTime);
& & & & & & & & printf(&%e\n&, kernelTime);
& & & & & & & & fclose(file);
& && &&&
& && & return 0;
}
复制代码}

我要回帖

更多关于 linux下获取cpu使用率 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信