<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[[实践OK]linux下实现CPU使用率和内存使用率获取方法]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Unix/LinuxC技术]]></category>
<pubDate>Sun, 26 Jun 2016 15:30:44 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	背景：获取CPU的使用率情况不是很容易一下获取到，用top得到一堆，得写个C来获取。<br/>calccpucmd.c <br/><textarea name="code" class="php" rows="15" cols="100">
#include&lt;stdio.h&gt;
#include&lt;stdlib.h&gt;
typedef struct //定义一个cpu occupy的结构体
 &#123;
 char name[20];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义一个char类型的数组名name有20个元素
 unsigned int user; //定义一个无符号的int类型的user
 unsigned int nice; //定义一个无符号的int类型的nice
 unsigned int system;//定义一个无符号的int类型的system
 unsigned int idle; //定义一个无符号的int类型的idle
 &#125;CPU_OCCUPY;

typedef struct //定义一个mem occupy的结构体
 &#123;
 char name[20];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义一个char类型的数组名name有20个元素
 unsigned long total;
 char name2[20];
 unsigned long free;
 &#125;MEM_OCCUPY;

get_memoccupy (MEM_OCCUPY *mem) //对无类型get函数含有一个形参结构体类弄的指针O
 &#123;
&nbsp;&nbsp;&nbsp;&nbsp; FILE *fd;
&nbsp;&nbsp;&nbsp;&nbsp; int n;
&nbsp;&nbsp;&nbsp;&nbsp; char buff[256];
&nbsp;&nbsp;&nbsp;&nbsp; MEM_OCCUPY *m;
&nbsp;&nbsp;&nbsp;&nbsp; m=mem;

&nbsp;&nbsp;&nbsp;&nbsp; fd = fopen (&quot;/proc/meminfo&quot;, &quot;r&quot;);

&nbsp;&nbsp;&nbsp;&nbsp; fgets (buff, sizeof(buff), fd);
&nbsp;&nbsp;&nbsp;&nbsp; fgets (buff, sizeof(buff), fd);
&nbsp;&nbsp;&nbsp;&nbsp; fgets (buff, sizeof(buff), fd);
&nbsp;&nbsp;&nbsp;&nbsp; fgets (buff, sizeof(buff), fd);
&nbsp;&nbsp;&nbsp;&nbsp; sscanf (buff, &quot;%s %u %s&quot;, m-&gt;name, &amp;m-&gt;total, m-&gt;name2);

&nbsp;&nbsp;&nbsp;&nbsp; fgets (buff, sizeof(buff), fd); //从fd文件中读取长度为buff的字符串再存到起始地址为buff这个空间里
&nbsp;&nbsp;&nbsp;&nbsp; sscanf (buff, &quot;%s %u&quot;, m-&gt;name2, &amp;m-&gt;free, m-&gt;name2);

&nbsp;&nbsp;&nbsp;&nbsp; fclose(fd);&nbsp;&nbsp;&nbsp;&nbsp; //关闭文件fd
 &#125;

int cal_cpuoccupy (CPU_OCCUPY *o, CPU_OCCUPY *n)
 &#123;
&nbsp;&nbsp;&nbsp;&nbsp; unsigned long od, nd;
&nbsp;&nbsp;&nbsp;&nbsp; unsigned long id, sd;
&nbsp;&nbsp;&nbsp;&nbsp; int cpu_use = 0;

&nbsp;&nbsp;&nbsp;&nbsp; od = (unsigned long) (o-&gt;user + o-&gt;nice + o-&gt;system +o-&gt;idle);//第一次(用户+优先级+系统+空闲)的时间再赋给od
&nbsp;&nbsp;&nbsp;&nbsp; nd = (unsigned long) (n-&gt;user + n-&gt;nice + n-&gt;system +n-&gt;idle);//第二次(用户+优先级+系统+空闲)的时间再赋给od

&nbsp;&nbsp;&nbsp;&nbsp; id = (unsigned long) (n-&gt;user - o-&gt;user);&nbsp;&nbsp;&nbsp;&nbsp;//用户第一次和第二次的时间之差再赋给id
&nbsp;&nbsp;&nbsp;&nbsp; sd = (unsigned long) (n-&gt;system - o-&gt;system);//系统第一次和第二次的时间之差再赋给sd
&nbsp;&nbsp;&nbsp;&nbsp; if((nd-od) != 0)
&nbsp;&nbsp;&nbsp;&nbsp; cpu_use = (int)((sd+id)*10000)/(nd-od); //((用户+系统)乖100)除(第一次和第二次的时间差)再赋给g_cpu_used
&nbsp;&nbsp;&nbsp;&nbsp; else cpu_use = 0;
&nbsp;&nbsp;&nbsp;&nbsp; //printf(&quot;cpu: %u/n&quot;,cpu_use);
&nbsp;&nbsp;&nbsp;&nbsp; return cpu_use;
 &#125;

get_cpuoccupy (CPU_OCCUPY *cpust) //对无类型get函数含有一个形参结构体类弄的指针O
 &#123;
&nbsp;&nbsp;&nbsp;&nbsp; FILE *fd;
&nbsp;&nbsp;&nbsp;&nbsp; int n;
&nbsp;&nbsp;&nbsp;&nbsp; char buff[256];
&nbsp;&nbsp;&nbsp;&nbsp; CPU_OCCUPY *cpu_occupy;
&nbsp;&nbsp;&nbsp;&nbsp; cpu_occupy=cpust;

&nbsp;&nbsp;&nbsp;&nbsp; fd = fopen (&quot;/proc/stat&quot;, &quot;r&quot;);
&nbsp;&nbsp;&nbsp;&nbsp; fgets (buff, sizeof(buff), fd);

&nbsp;&nbsp;&nbsp;&nbsp; sscanf (buff, &quot;%s %u %u %u %u&quot;, cpu_occupy-&gt;name, &amp;cpu_occupy-&gt;user, &amp;cpu_occupy-&gt;nice,&amp;cpu_occupy-&gt;system, &amp;cpu_occupy-&gt;idle);

&nbsp;&nbsp;&nbsp;&nbsp; fclose(fd);
 &#125;

int main()
 &#123;
&nbsp;&nbsp;&nbsp;&nbsp; CPU_OCCUPY cpu_stat1;
&nbsp;&nbsp;&nbsp;&nbsp; CPU_OCCUPY cpu_stat2;
&nbsp;&nbsp;&nbsp;&nbsp; MEM_OCCUPY mem_stat;
&nbsp;&nbsp;&nbsp;&nbsp; int cpu;

&nbsp;&nbsp;&nbsp;&nbsp; //获取内存
&nbsp;&nbsp;&nbsp;&nbsp; get_memoccupy ((MEM_OCCUPY *)&amp;mem_stat);

&nbsp;&nbsp;&nbsp;&nbsp; //第一次获取cpu使用情况
&nbsp;&nbsp;&nbsp;&nbsp; get_cpuoccupy((CPU_OCCUPY *)&amp;cpu_stat1);
&nbsp;&nbsp;&nbsp;&nbsp; sleep(10);

&nbsp;&nbsp;&nbsp;&nbsp; //第二次获取cpu使用情况
&nbsp;&nbsp;&nbsp;&nbsp; get_cpuoccupy((CPU_OCCUPY *)&amp;cpu_stat2);

&nbsp;&nbsp;&nbsp;&nbsp; //计算cpu使用率
&nbsp;&nbsp;&nbsp;&nbsp; cpu = cal_cpuoccupy ((CPU_OCCUPY *)&amp;cpu_stat1, (CPU_OCCUPY *)&amp;cpu_stat2);
&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;%d&#92;n&quot;,cpu);

&nbsp;&nbsp;&nbsp;&nbsp; return 0;
 &#125;

</textarea><br/>gcc calccpucmd.c -o calccpucmd<br/> ./calccpucmd <br/>20<br/><br/>想获取一下目标机运行时linux系统的硬件占用情况，写了这几个小程序，以后直接用了。<br/> 方法就是读取proc下的文件来获取了。 cpu使用率：&nbsp;&nbsp;&nbsp;&nbsp;/proc/stat ，内存使用情况：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/proc/meminfo<br/> 看程序 ：<br/> <br/> typedef struct PACKED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //定义一个cpu occupy的结构体<br/> &#123;<br/> char name[20];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义一个char类型的数组名name有20个元素<br/> unsigned int user; //定义一个无符号的int类型的user<br/> unsigned int nice; //定义一个无符号的int类型的nice<br/> unsigned int system;//定义一个无符号的int类型的system<br/> unsigned int idle; //定义一个无符号的int类型的idle<br/> &#125;CPU_OCCUPY;<br/> <br/>typedef struct PACKED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //定义一个mem occupy的结构体<br/> &#123;<br/> char name[20];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义一个char类型的数组名name有20个元素<br/> unsigned long total;<br/> char name2[20];<br/> unsigned long free;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/> &#125;MEM_OCCUPY;<br/> <br/>get_memoccupy (MEM_OCCUPY *mem) //对无类型get函数含有一个形参结构体类弄的指针O<br/> &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp; FILE *fd;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; int n;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; char buff[256];&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; MEM_OCCUPY *m;<br/>&nbsp;&nbsp;&nbsp;&nbsp; m=mem;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; fd = fopen (&quot;/proc/meminfo&quot;, &quot;r&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; fgets (buff, sizeof(buff), fd);<br/>&nbsp;&nbsp;&nbsp;&nbsp; fgets (buff, sizeof(buff), fd);<br/>&nbsp;&nbsp;&nbsp;&nbsp; fgets (buff, sizeof(buff), fd);<br/>&nbsp;&nbsp;&nbsp;&nbsp; fgets (buff, sizeof(buff), fd);<br/>&nbsp;&nbsp;&nbsp;&nbsp; sscanf (buff, &quot;%s %u %s&quot;, m-&gt;name, &amp;m-&gt;total, m-&gt;name2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; fgets (buff, sizeof(buff), fd); //从fd文件中读取长度为buff的字符串再存到起始地址为buff这个空间里<br/>&nbsp;&nbsp;&nbsp;&nbsp; sscanf (buff, &quot;%s %u&quot;, m-&gt;name2, &amp;m-&gt;free, m-&gt;name2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; fclose(fd);&nbsp;&nbsp;&nbsp;&nbsp; //关闭文件fd<br/> &#125;<br/> <br/>int cal_cpuoccupy (CPU_OCCUPY *o, CPU_OCCUPY *n)<br/> &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; unsigned long od, nd;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; unsigned long id, sd;<br/>&nbsp;&nbsp;&nbsp;&nbsp; int cpu_use = 0;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; od = (unsigned long) (o-&gt;user + o-&gt;nice + o-&gt;system +o-&gt;idle);//第一次(用户+优先级+系统+空闲)的时间再赋给od<br/>&nbsp;&nbsp;&nbsp;&nbsp; nd = (unsigned long) (n-&gt;user + n-&gt;nice + n-&gt;system +n-&gt;idle);//第二次(用户+优先级+系统+空闲)的时间再赋给od<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; id = (unsigned long) (n-&gt;user - o-&gt;user);&nbsp;&nbsp;&nbsp;&nbsp;//用户第一次和第二次的时间之差再赋给id<br/>&nbsp;&nbsp;&nbsp;&nbsp; sd = (unsigned long) (n-&gt;system - o-&gt;system);//系统第一次和第二次的时间之差再赋给sd<br/>&nbsp;&nbsp;&nbsp;&nbsp; if((nd-od) != 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp; cpu_use = (int)((sd+id)*10000)/(nd-od); //((用户+系统)乖100)除(第一次和第二次的时间差)再赋给g_cpu_used<br/>&nbsp;&nbsp;&nbsp;&nbsp; else cpu_use = 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp; //printf(&quot;cpu: %u/n&quot;,cpu_use);<br/>&nbsp;&nbsp;&nbsp;&nbsp; return cpu_use;<br/> &#125;<br/> <br/>get_cpuoccupy (CPU_OCCUPY *cpust) //对无类型get函数含有一个形参结构体类弄的指针O<br/> &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; FILE *fd;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; int n;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; char buff[256];<br/>&nbsp;&nbsp;&nbsp;&nbsp; CPU_OCCUPY *cpu_occupy;<br/>&nbsp;&nbsp;&nbsp;&nbsp; cpu_occupy=cpust;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; fd = fopen (&quot;/proc/stat&quot;, &quot;r&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp; fgets (buff, sizeof(buff), fd);<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; sscanf (buff, &quot;%s %u %u %u %u&quot;, cpu_occupy-&gt;name, &amp;cpu_occupy-&gt;user, &amp;cpu_occupy-&gt;nice,&amp;cpu_occupy-&gt;system, &amp;cpu_occupy-&gt;idle);<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; fclose(fd);&nbsp;&nbsp;&nbsp;&nbsp;<br/> &#125;<br/> <br/>int main()<br/> &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp; CPU_OCCUPY cpu_stat1;<br/>&nbsp;&nbsp;&nbsp;&nbsp; CPU_OCCUPY cpu_stat2;<br/>&nbsp;&nbsp;&nbsp;&nbsp; MEM_OCCUPY mem_stat;<br/>&nbsp;&nbsp;&nbsp;&nbsp; int cpu;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; //获取内存<br/>&nbsp;&nbsp;&nbsp;&nbsp; get_memoccupy ((MEM_OCCUPY *)&amp;mem_stat);<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; //第一次获取cpu使用情况<br/>&nbsp;&nbsp;&nbsp;&nbsp; get_cpuoccupy((CPU_OCCUPY *)&amp;cpu_stat1);<br/>&nbsp;&nbsp;&nbsp;&nbsp; sleep(10);<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; //第二次获取cpu使用情况<br/>&nbsp;&nbsp;&nbsp;&nbsp; get_cpuoccupy((CPU_OCCUPY *)&amp;cpu_stat2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; //计算cpu使用率<br/>&nbsp;&nbsp;&nbsp;&nbsp; cpu = cal_cpuoccupy ((CPU_OCCUPY *)&amp;cpu_stat1, (CPU_OCCUPY *)&amp;cpu_stat2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br/> &#125;<br/> <br/> <br/> <br/> <br/> <br/> <br/> <br/>我们在搞性能测试的时候，对后台服务器的CPU利用率监控是一个常用的手段。服务器的CPU利用率高，则表明服务器很繁忙。如果前台响应时间越来越大，而后台CPU利用率始终上不去，说明在某个地方有瓶颈了，系统需要调优。这个是即使不懂技术的人都容易理解的事情。<br/> <br/>上面理解对吗？我个人觉得不十分准确。这个要看后台你测试的进程是什么类型的。如果是计算密集型的进程，当前端压力越来越大的时候，很容易把CPU 利用率打上去。但是如果是I/O网络密集型的进程，即使客户端的请求越来越多，但是服务器CPU不一定能上去，这个是你要测试的进程的自然属性决定的。比 较常见的就是，大文件频繁读写的cpu开销远小于小文件频繁读写的开销。因为在I/O吞吐量一定时，小文件的读写更加频繁，需要更多的cpu来处理I/O 的中断。<br/> <br/>在Linux/Unix下，CPU利用率分为用户态 ，系统态 和空闲态 ，分别表示CPU处于用户态执行的时间，系统内核执行的时间，和空闲系统进程执行的时间。平时所说的CPU利用率是指：CPU执行非系统空闲进程的时间 / CPU总的执行时间 。<br/> <br/>在Linux的内核中，有一个全局变量：Jiffies。 Jiffies代表时间。它的单位随硬件平台的不同而不同。系统里定义了一个常数HZ，代表每秒种最小时间间隔的数目。这样jiffies的单位就是 1/HZ。Intel平台jiffies的单位是1/100秒，这就是系统所能分辨的最小时间间隔了。每个CPU时间片，Jiffies都要加1。 CPU的利用率就是用执行用户态+系统态的Jiffies除以总的Jifffies来表示。<br/> <br/>在Linux系统中，可以用/proc/stat文件来计算cpu的利用率(详细的解释可参考：http: //www.linuxhowtos.org/System/procstat.htm)。这个文件包含了所有CPU活动的信息，该文件中的所有值都是从 系统启动开始累计到当前时刻。<br/> <br/>如：<br/> <br/>1.[sailorhzr@builder ~]$ cat /proc/stat&nbsp;&nbsp;<br/>2.cpu&nbsp;&nbsp;432661 13295&nbsp;&nbsp; 86656 422145968&nbsp;&nbsp; 171474 233&nbsp;&nbsp; 5346&nbsp;&nbsp;<br/>3.cpu 0 123075&nbsp;&nbsp; 2462 23494&nbsp;&nbsp; 105543694 16586&nbsp;&nbsp; 0 4615&nbsp;&nbsp;<br/>4.cpu 1 111917&nbsp;&nbsp; 4124 23858&nbsp;&nbsp; 105503820 69697&nbsp;&nbsp; 123 371&nbsp;&nbsp;<br/>5.cpu 2 103164&nbsp;&nbsp; 3554 21530&nbsp;&nbsp; 105521167 64032&nbsp;&nbsp; 106 334&nbsp;&nbsp;<br/>6.cpu 3 94504&nbsp;&nbsp; 3153 17772&nbsp;&nbsp; 105577285 21158&nbsp;&nbsp; 4 24&nbsp;&nbsp;<br/>7.intr&nbsp;&nbsp;1065711094 1057275779&nbsp;&nbsp; 92 0&nbsp;&nbsp; 6 6&nbsp;&nbsp; 0 4&nbsp;&nbsp; 0 3527&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 70&nbsp;&nbsp; 0 20&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 7376958 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 1054602 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 30 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0&nbsp;&nbsp; 0 0 <br/> 8.ctxt&nbsp;&nbsp;19067887&nbsp;&nbsp;<br/>9.btime&nbsp;&nbsp;1139187531&nbsp;&nbsp;<br/>10.processes&nbsp;&nbsp;270014&nbsp;&nbsp;<br/>11.procs_running&nbsp;&nbsp;1&nbsp;&nbsp;<br/>12.procs_blocked&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;<br/>13. <br/>输出解释<br/>CPU 以及CPU0、CPU1、CPU2、CPU3每行的每个参数意思（以第一行为例）为：<br/> <br/><br/>参数<br/> <br/>解释<br/> <br/><br/>user (432661)<br/>nice (13295)<br/>system (86656)<br/>idle (422145968)<br/>iowait (171474)<br/>irq (233)<br/>softirq (5346)<br/> <br/> <br/>从系统启动开始累计到当前时刻，用户态的CPU时间（单位：jiffies） ，不包含 nice值为负进程。1jiffies=0.01秒<br/> 从系统启动开始累计到当前时刻，nice值为负的进程所占用的CPU时间（单位：jiffies）<br/> 从系统启动开始累计到当前时刻，核心时间（单位：jiffies）<br/> 从系统启动开始累计到当前时刻，除硬盘IO等待时间以外其它等待时间（单位：jiffies）<br/> 从系统启动开始累计到当前时刻，硬盘IO等待时间（单位：jiffies） ，<br/> 从系统启动开始累计到当前时刻，硬中断时间（单位：jiffies）<br/> 从系统启动开始累计到当前时刻，软中断时间（单位：jiffies）<br/> <br/>CPU时间=user+system+nice+idle+iowait+irq+softirq<br/>“intr”这行给出中断的信息，第一个为自系统启动以来，发生的所有的中断的次数；然后每个数对应一个特定的中断自系统启动以来所发生的次数。<br/> <br/>“ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。<br/> <br/>“btime”给出了从系统启动到现在为止的时间，单位为秒。<br/> <br/>“processes (total_forks) 自系统启动以来所创建的任务的个数目。<br/> <br/>“procs_running”：当前运行队列的任务的数目。<br/> <br/>“procs_blocked”：当前被阻塞的任务的数目。<br/> <br/>那么CPU利用率可以使用以下两个方法。先取两个采样点，然后计算其差值：<br/> <br/>1.cpu usage=(idle 2 -idle 1 )/(cpu 2 -cpu 1 )* 100&nbsp;&nbsp;<br/>2.cpu usage=[(user_ 2&nbsp;&nbsp;+sys_ 2 +nice_ 2 ) - (user_ 1&nbsp;&nbsp;+ sys_ 1 +nice_ 1 )]/(total_ 2&nbsp;&nbsp;- total_ 1 )* 100 <br/> 3. <br/>以下用分别用bash和perl做的一个cpu利用率的计算：<br/> <br/>本人注:以下代码则采用公式为:<br/> <br/>1.total_ 0 USER[ 0 ]+NICE[ 0 ]+SYSTEM[ 0 ]+IDLE[ 0 ]+IOWAIT[ 0 ]+IRQ[ 0 ]+SOFTIRQ[ 0 ]&nbsp;&nbsp;<br/>2.total_ 1 =USER[ 1 ]+NICE[ 1 ]+SYSTEM[ 1 ]+IDLE[ 1 ]+IOWAIT[ 1 ]+IRQ[ 1 ]+SOFTIRQ[ 1 ] <br/> 3.cpu usage=(IDLE[ 0 ]-IDLE[ 1 ]) / (total_ 0 -total_ 1 ) *&nbsp;&nbsp;100&nbsp;&nbsp;<br/>4. <br/>###bash 代码<br/>1.CODE: #!/bin/sh&nbsp;&nbsp;<br/>2. <br/>3.##echo user nice system idle iowait irq softirq&nbsp;&nbsp;<br/>4.CPULOG_1=$(cat /proc/stat &#124; grep&nbsp;&nbsp;&#039;cpu &#039;&nbsp;&nbsp;&#124; awk&nbsp;&nbsp;&#039;&#123;print $2&quot; &quot;$3&quot; &quot;$4&quot; &quot;$5&quot; &quot;$6&quot; &quot;$7&quot; &quot;$8&#125;&#039; ) <br/> 5.SYS_IDLE_1=$(echo&nbsp;&nbsp;$CPULOG_1&nbsp;&nbsp;&#124; awk&nbsp;&nbsp;&#039;&#123;print $4&#125;&#039; )&nbsp;&nbsp;<br/>6.Total_1=$(echo&nbsp;&nbsp;$CPULOG_1&nbsp;&nbsp;&#124; awk&nbsp;&nbsp;&#039;&#123;print $1+$2+$3+$4+$5+$6+$7&#125;&#039; )&nbsp;&nbsp;<br/>7. <br/>8.sleep 5&nbsp;&nbsp;<br/>9. <br/>10.CPULOG_2=$(cat /proc/stat &#124; grep&nbsp;&nbsp;&#039;cpu &#039;&nbsp;&nbsp;&#124; awk&nbsp;&nbsp;&#039;&#123;print $2&quot; &quot;$3&quot; &quot;$4&quot; &quot;$5&quot; &quot;$6&quot; &quot;$7&quot; &quot;$8&#125;&#039; ) <br/> 11.SYS_IDLE_2=$(echo&nbsp;&nbsp;$CPULOG_2&nbsp;&nbsp;&#124; awk&nbsp;&nbsp;&#039;&#123;print $4&#125;&#039; )&nbsp;&nbsp;<br/>12.Total_2=$(echo&nbsp;&nbsp;$CPULOG_2&nbsp;&nbsp;&#124; awk&nbsp;&nbsp;&#039;&#123;print $1+$2+$3+$4+$5+$6+$7&#125;&#039; )&nbsp;&nbsp;<br/>13. <br/>14.SYS_IDLE=`expr&nbsp;&nbsp;$SYS_IDLE_2&nbsp;&nbsp;-&nbsp;&nbsp;$SYS_IDLE_1 `&nbsp;&nbsp;<br/>15. <br/>16.Total=`expr&nbsp;&nbsp;$Total_2&nbsp;&nbsp;-&nbsp;&nbsp;$Total_1 `&nbsp;&nbsp;<br/>17.SYS_USAGE=`expr&nbsp;&nbsp;$SYS_IDLE / $Total *100 &#124;bc -l`&nbsp;&nbsp;<br/>18. <br/>19.SYS_Rate=`expr 100- $SYS_USAGE&nbsp;&nbsp;&#124;bc -l`&nbsp;&nbsp;<br/>20. <br/>21.Disp_SYS_Rate=`expr&nbsp;&nbsp;&quot;scale=3; $SYS_Rate/1&quot;&nbsp;&nbsp;&#124;bc`&nbsp;&nbsp;<br/>22.echo&nbsp;&nbsp;$Disp_SYS_Rate %&nbsp;&nbsp;<br/>23. <br/>24.&nbsp;&nbsp; <br/>###perl 代码<br/>1.#!/usr/bin/perl&nbsp;&nbsp;<br/>2. <br/>3.use warnings;&nbsp;&nbsp;<br/>4. <br/>5.$SLEEPTIME =5;&nbsp;&nbsp;<br/>6. <br/>7.if&nbsp;&nbsp;(-e&nbsp;&nbsp;&quot;/tmp/stat&quot; ) &#123;&nbsp;&nbsp;<br/>8.unlink&nbsp;&nbsp;&quot;/tmp/stat&quot; ;&nbsp;&nbsp;<br/>9.&#125;&nbsp;&nbsp;<br/>10.open (JIFF_TMP,&nbsp;&nbsp;&quot;&gt;&gt;/tmp/stat&quot; ) &#124;&#124; die&nbsp;&nbsp;&quot;Can&#039;t open /proc/stat file!/n&quot; ;&nbsp;&nbsp;<br/>11.open (JIFF,&nbsp;&nbsp;&quot;/proc/stat&quot; ) &#124;&#124; die&nbsp;&nbsp;&quot;Can&#039;t open /proc/stat file!/n&quot; ;&nbsp;&nbsp;<br/>12.@jiff_0 =&lt;JIFF&gt;;&nbsp;&nbsp;<br/>13.print JIFF_TMP&nbsp;&nbsp;$jiff_0 [0] ;&nbsp;&nbsp;<br/>14.close (JIFF);&nbsp;&nbsp;<br/>15. <br/>16.sleep&nbsp;&nbsp;$SLEEPTIME ;&nbsp;&nbsp;<br/>17. <br/>18.open (JIFF,&nbsp;&nbsp;&quot;/proc/stat&quot; ) &#124;&#124; die&nbsp;&nbsp;&quot;Can&#039;t open /proc/stat file!/n&quot; ;&nbsp;&nbsp;<br/>19.@jiff_1 =&lt;JIFF&gt;;&nbsp;&nbsp;<br/>20.print JIFF_TMP&nbsp;&nbsp;$jiff_1 [0];&nbsp;&nbsp;<br/>21.close (JIFF);&nbsp;&nbsp;<br/>22.close (JIFF_TMP);&nbsp;&nbsp;<br/>23. <br/>24.@USER =`awk&nbsp;&nbsp;&#039;&#123;print /$2&#125;&#039;&nbsp;&nbsp; &quot;/tmp/stat&quot; `;&nbsp;&nbsp;<br/>25.@NICE =`awk&nbsp;&nbsp;&#039;&#123;print /$3&#125;&#039;&nbsp;&nbsp; &quot;/tmp/stat&quot; `;&nbsp;&nbsp;<br/>26.@SYSTEM =`awk&nbsp;&nbsp;&#039;&#123;print /$4&#125;&#039;&nbsp;&nbsp; &quot;/tmp/stat&quot; `;&nbsp;&nbsp;<br/>27.@IDLE =`awk&nbsp;&nbsp;&#039;&#123;print /$5&#125;&#039;&nbsp;&nbsp; &quot;/tmp/stat&quot; `;&nbsp;&nbsp;<br/>28.@IOWAIT =`awk&nbsp;&nbsp;&#039;&#123;print /$6&#125;&#039;&nbsp;&nbsp; &quot;/tmp/stat&quot; `;&nbsp;&nbsp;<br/>29.@IRQ =`awk&nbsp;&nbsp;&#039;&#123;print /$7&#125;&#039;&nbsp;&nbsp; &quot;/tmp/stat&quot; `;&nbsp;&nbsp;<br/>30.@SOFTIRQ =`awk&nbsp;&nbsp;&#039;&#123;print /$8&#125;&#039;&nbsp;&nbsp; &quot;/tmp/stat&quot; `;&nbsp;&nbsp;<br/>31. <br/>32.$JIFF_0 = $USER [0]+ $NICE [0]+ $SYSTEM [0]+ $IDLE [0]+ $I
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [实践OK]linux下实现CPU使用率和内存使用率获取方法]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>