如何提高 linux 提高程序cpu使用率率

linux下如何获取cpu的利用率_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
linux下如何获取cpu的利用率
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩3页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(5866)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_095068',
blogTitle:'linux下限制CPU使用率的3种方法',
blogAbstract:'linux下限制CPU使用率的3种方法
1,apache本身的限制功能(RLimitCPU)
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}您现在的位置:&&>>&&>>&&>>&&>>&正文
linux下计算进程cpu使用率和内存使用率的方法
  在实际工作当中,有时候需要计算某个进程的cpu使用率或者是内存使用率。
  下面将介绍一种中计算某个指定进程的cpu使用率和内存使用率的方法。
  在正式开始之前,先对要使用到的文件和命令进行一下说明。
  0. /proc/uptime
  该文件中储存了两个数字,第一个数值代表系统总的启动时间,第二个数值则代表系统空闲的时间,单位都是秒。
  例如,在我的工作机器上执行结果如下:
  $ cat /proc/uptime
  1. /proc/[pid]/stat
  包含了所有CPU活跃的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。
  在此只介绍几个和本文相关的参数,其他参数就不一一介绍了,相关介绍网上有很多,请大家自行搜索。
  utime:该进程在用户态运行的时间,单位为jiffies
  stime:该进程在核心态运行的时间,单位为jiffies
  start_time:该进程启动的时间,单位为jiffies
  rss:该进程当前驻留物理地址空间的大小,单位是page
  例如,在我的工作机器上执行结果如下:
  $ cat /proc/1/stat
  1 (init) S 0 1 1 0 -1 9
1 1 0 0 0 0 0 95
0 0 0 5 0 0 28 0 0
  2. jiffies
  上述描述中,对于时间的计算,用了两种计量单位:秒和jiffies。
  对于秒,大家肯定都不陌生,但是jiffies就未必了。jiffies是一个全局变量,用来记录自系统启动以来产生的节拍的总数。
  启动时,内核将该变量初始化为0,此后,每次时钟中断处理程序都会增加该变量的值。
  一秒内时钟中断的次数等于Hz,所以jiffies一秒内增加的值也就是Hz。
  总结起来,jiffies与秒的运算关系为:
  second = jiffies / Hz
  3. /proc/meminfo
  获取系统内存的详细信息。例如,在我的工作机器上执行结果如下:
  $ cat /proc/meminfo
  MemTotal: 8131024 kB
  MemFree: 6895932 kB
  Buffers: 502416 kB
  Cached: 307764 kB
  SwapCached: 4132 kB
  下面言归正传,讲述如何在代码中计算某个进程的cpu使用率和内存使用率
【责编:peter】
?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]
相关产品和培训
 友情推荐链接
 专题推荐
 ? ? ? ? ? ? ? ? ? ?
 今日更新
?&?&?&?&?&?&?&?&?&?&
 认证培训
 频道精选
 Windows频道导航
                      &在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 的话情况就更不妙了,说明这座桥基本上已经快承受不了,还有超出桥负载两倍多的车辆正在等待。
& & & & & & & & & & & & &&
& & 上面的情况和处理器的负载情况非常相似。一辆汽车的过桥时间就好比是处理器处理某线程 的实际时间。Unix 系统定义的进程运行时长为所有处理器内核的处理时间加上线程
在队列中等待的时间。
和收过桥费的管理员一样,你当然希望你的汽车(操作)不会被焦急的等待。所以,理想状态 下,都希望负载平均值小于 1.00 。当然不排除部分峰值会超过 1.00,但长此以往保持这 个状态,就说明会有问题,这时候你应该会很焦急。
& & &在多处理器系统中,负载均值是基于内核的数量决定的。以 100% 负载计算,1.00
表示单个处理器,而 2.00 则说明有两个双处理器,那么 4.00 就说明主机具有四个处理器。回到我们上面有关车辆过桥的比喻。1.00 我说过是「一条单车道的道路」。那么在单车道 1.00 情况中,说明这桥梁已经被车塞满了。而在双处理器系统中,这意味着多出了一倍的 负载,也就是说还有 50% 的剩余系统资源 ---- 因为还有另外条车道可以通行。
& & & & & & & & & & & & &&
所以,单处理器已经在负载的情况下,双处理器的负载满额的情况是 2.00,它还有一倍的资源可以利用。
& & & 实际上Linux系统中很多都是用CPU负载均值(load average)来代表当前系统的负载状况,比如使用top命令:
在第一行的最后显示的为 “&load average: 1.16 , &1.27 &,1.14”
使用“uptime”命令,效果也是类似:
这三个数分别是:一分钟内、五分钟内、十五分钟内的系统负载均值。也就是说,从右向左看这几个数据,我们可以判断系统负载的发展趋势。
事实上,这正是CPU负载所需要测量的,因为负载均值不包括那些等待I/O、网络、数据或者其他不依赖CPU的进程或线程,它关注的仅仅是积极要求CPU时间的进程或线程。这与CPU利用率是有很大不同的。
负载均值与CPU利用率在两个方面有很大的区别:
& & 1)&负载均值用来估量CPU利用率的发展趋势,而不是某一时刻的状况
& & 2) 负载均值包括所有CPU的需求,而不仅仅是在测量时活跃的
第三节 & 如何计算CPU利用率
在Linux系统中,可以用/proc/stat文件来计算cpu的利用率()。这个文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。如:
输出解释:
(CPU 以及CPU0、CPU1、CPU2、CPU3每行的每个参数意思(以第一行为例))
& && & & & & & &&
user (426215)&
从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies) ,不包含 nice值为负进程。1jiffies=0.01秒
nice (701)
从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies)
system (115732)
从系统启动开始累计到当前时刻,核心时间(单位:jiffies)
idle (2023866)
从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies)
iowait (27329)
从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies) ,
从系统启动开始累计到当前时刻,硬中断时间(单位: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 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
第四节 & 对第一节中的puzzle进行解释
& & & &再回顾一下三个疑问:第一、为毛运行a.out和b.out显示的CPU利用率不一样……第二、为毛在ps中显示的a.out和b.out的CPU利用率不一样?第三、为毛ps中a.out和b.out的CPU利用率分别为94.1%和90.0%,而两者加一起远远大于100%?!!
实际上,这些问题感觉很诡异,但是经过我一番学习之后,发现,答案其实很简单。
& & & & 首先,为啥a.out和b.out显示的CPU利用率不一样?在我问我们老师Nicholas Mc Guire的邮件上,他回复“cpu utilization is a per cpu value of how much time
the CPU is spending with process X” 也就是说CPU利用率是一个程序占用一个CPU处理器多少时间的百分比值!(他说的是某个进程占有的CPU利用率,如top上显示的!而我想要算的是总的的CPU利用率,但是他提到了process X !也就是说,如上面的双处理器的负载满额的情况是 2.00,我的机器是双核,所以,这里a.out和b.out算得分别是两个CPU核心上的利用率!)
而经过一段时间后,a.out和b.out显示的值都会很接近!因为,双核的计算任务不可能相差很大的!
如某一时间,a.out显示如下:
此时b.out显示如下:
而,此时top结果:
这个观点可以通过如下方法论证:
& & & 如果我把a.out再拷贝两个副本分别叫c.out和d.out,那么top命令下,显示如下所示,a.out和b.out原来分别占90%左右,现在a.out、b.out、c.out和d.out则分别占40%左右,我们可以理解成,原先a.out占用cpu0的90%空闲时间(上文已经提到:因为我们的程序就是设置了极低的优先级,如果有任何计算任务都会打断,而如果没有计算任务,我们的程序就会占用cpu时间,所以占用的都是空间时间),而b.out占用cpu1的90%空闲时间,而现在c.out和a.out平分了cpu0的这90%空闲时间,d.out和b.out平分了cpu1的这90%空闲时间,所以,a.out、b.out、c.out和d.out此时的CPU利用率则分别占40%左右。
第五节 & Linux提供的一些查看系统信息的工具
使用下面这些命令我们可以查询总的CPU使用率、单独的CPU使用率(对于对称多处理机器SMP)、从你上次启动后的平均CPU使用率等。
4.1 &&老当益壮的top命令
使用top命令可以动态的查看CPU使用率。它会显示当前内核管理着的任务信息,它还会显示上线时间、负载均值、物理和交换内存使用状况。使用如下:
& & & & & &$ top
按Q键推出top。
4.2 & 使用&mpstat&命令
使用这个命令,你需要先安装sysstat工具,对于Debian或Ubuntu用户,可以通过apt-get直接安装:
& & & & & &&$ apt-get install sysstat
使用如下命令查看CPU使用率信息:
& & & & & &&$ mpstat
使用如下命令可以监控单独的CPU使用率信息:
& & & & & &&$ mpstat -P ALL
4.3 & 使用&sar&命令
使用sar命令显示CPU使用率的语法如下:
& & & & & &&$ sar -u 2 5&&( sar [ 选项 ] [ &时间间隔& [ &次数& ] ])
这条命令会显示2秒内的CPU使用率,总共显示5次。
4.4 & 使用&iostat&命令
&iostat&命令可以用来查询从系统启动以来的是CPU平均使用率以及设备或者分区的I/O状况:
& & & & &&& $ iostat
4.5 & GUI Tools 一些有图形界面的工具
KDE桌面环境有一些系统监控器一类的工具可以用来监控CPU使用率甚至更多的系统信息(比如说CPU负载状况、物理内存以及交换分区的数据占用信息),你还可以使用它来杀死一些进程。
下表总结了若干Linux下的工具:
& & &&& & & & & 简单介绍
查看进程活动状态以及一些系统状况
查看系统状态、硬件和系统信息等
查看CPU 负载,硬盘状况
综合工具,查看系统状况
查看多处理器状况
查看网络状况
实时网络状况监测
抓取网络数据包,详细分析
查看多处理器状况
&数据包分析工具
网络带宽工具
综合工具,综合了 vmstat, iostat, ifstat, netstat 等多个信息
& & & & & & & &[1] &
& & & & & & & &[2] &
& & & & & & & &[3] &
& & & & & & & &[4] &
& & & & & & & &[5] &&([4]的中文翻译版)
& & & & & & & &[6] &
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:238053次
积分:3225
积分:3225
排名:第8413名
原创:11篇
转载:540篇
评论:13条
(1)(3)(10)(1)(9)(5)(4)(7)(2)(4)(1)(2)(3)(4)(3)(6)(2)(6)(8)(17)(7)(9)(6)(28)(61)(30)(18)(6)(4)(1)(5)(5)(7)(24)(18)(19)(3)(3)(22)(8)(21)(10)(9)(12)(29)(28)(53)(2)(7)8487人阅读
小技巧(275)
for i in `seq 1 $(cat /proc/cpuinfo |grep &physical id& |wc -l)`; do dd if=/dev/zero of=/dev/null & done
cat /proc/cpuinfo |grep &physical id& | wc -l 可以获得CPU的个数, 我们将其表示为N.
seq 1 N 用来生成1到N之间的数字
for i in `seq 1 N`; 就是循环执行命令,从1到N
dd if=/dev/zero of=/dev/null 执行dd命令, 输出到/dev/null, 实际上只占用CPU, 没有IO操作.
由于连续执行N个(N是CPU个数)的dd 命令, 且使用率为100%, 这时调度器会调度每个dd命令在不同的CPU上处理.
最终就实现所有CPU占用率100%
另外,上述程序的结束可以使用:
1. fg 后按 ctrl + C (因为该命令是放在后台执行)
2. pkill -9 dd
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1375115次
积分:20114
积分:20114
排名:第305名
原创:428篇
转载:981篇
译文:146篇
评论:65条
(11)(20)(10)(22)(51)(22)(1)(1)(17)(9)(11)(65)(8)(29)(27)(1)(6)(32)(57)(29)(8)(3)(37)(89)(109)(51)(165)(92)(105)(220)(171)(34)(6)(19)(4)(1)(8)(6)(1)(1)}

我要回帖

更多关于 怎么提高cpu的使用率 的文章

更多推荐

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

点击添加站长微信