码迷,mamicode.com
首页 > 其他好文 > 详细

关于vmstat,top,ps aux查看的cpu占用率不一致的问题

时间:2016-05-01 17:53:27      阅读:1587      评论:0      收藏:0      [点我收藏+]

标签:动态   统计   



关于vmstat,top,ps aux查看的cpu占用率不一致的问题

问题:

用vmstat,top,和ps aux三个命令查看进程对cpu的占用率,数值差异很大。


例:

用 vmstat 查看系统cpu空闲率, id是cpu的空闲率,可以看出,空闲率一直在73%以上

用 ps aux 统计两个compress进程的cpu占用率,长时间恒定在15.5%和28.9%

用 top统计两个compress进程的cpu占用率,可以看出是一个动态变化的过程

(命令执行结果后面有显示)


这三个命令查出的cpu利用率不统一

首先,ps aux中两个compress进程占用cpu 15.5%+28.9%>40%,再加上其它进程,为

何vmstat查看cpu空闲率id还能一直大于73%

其次,top命令显示的进程compress的cpu占用率和ps显示的数值差别很大,ps的

cpu占用率雷打不动,一直是恒定值,

top的比较动态, 难道ps aux显示的进程cpu占用率不可靠?

最后,这三个命令查出的cpu占用率相互之间均不统一,用哪一个更可靠?例如输入如下命令,粗体字是cpu占用率


$ vmstat 1

procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----

r   b swpd free buff   cache si so bi bo in cs us sy id wa

0   0 432 802660   28724 5747324 0 0 204 770 0     0   6   3 90   2

3   0 432 799196   28724 5747392 0 0     0 152 1455 681   2   2 96   0

0   0 432 802420   28724 5747460 0 0     0 480 1599   1892 10   8 82 0

0   0 432 802292   28724 5747664 0 0     0 440 1859   6179 14 13 73 0

2   0 432 797636   28724 5752084 0 0     0 240 1403   3419   8   7 85   0

1   0 432 798732   28724 5751268 0 0     0 448 1506   4608 10   8 81   0

2   0 432 797924   28724 5752084 0 0     0 192 1752   4332 11 10 79   0

0   0 432 802076   28724 5747936 0 0     0 280 1705   1527 14   6 79 0


$ps aux | grep compress

USER    PID %CPU %MEM VSZ   RSS TTY    STAT START TIME COMMAND

img    6569 15.5   0.2 36716 16540 ?    S Aug12 230:57 ./bin/compress 8014

img    6570 28.9   0.2 54592 22524 ?    S Aug12 430:28 ./bin/compress 8004  


$top | grep compress

PID USER    PR   NI   VIRT   RES   SHR S %CPU %MEM TIME+   COMMAND                                                      

6569 img    16 0 40956   20m 6632 R 10.7   0.3 231:10.12 compress                                                       

6570 img    16 0 54592   21m 2456 S 20.3   0.3 430:54.32 compress                                                       

6569 img    17 0 36740   16m 2456 S 10.3   0.2 231:10.43 compress                                                       

6570 img    16 0 54592   21m 2456 R 58.9   0.3 430:56.09 compress                                                       

6569 img    16 0 36716   16m 2456 R 53.9   0.2 231:12.05 compress                                                       

6570 img    16 0 58444   24m 4752 R 69.9   0.3 430:58.19 compress                                                       

6569 img    16 0 36716   16m 2456 S 60.2   0.2 231:13.86 compress                                                       

6570 img    16 0 54592   21m 2456 S 52.6   0.3 430:59.77 compress                                                       

6569 img    15 0 36716   16m 2456 S 45.3   0.2 231:15.22 compress                                                       


大概看了些源码,补充一下:

top,ps,vmstat都是根据系统的proc文件进行计算的,其中vmstat,top都使用了/proc/stat文件,而ps,top也使用了/procstat文件,其中*为进程号,计算方式为使用cpu总的时间片数/Hertz,目前确认为对于每个物理cpu的占用比率,因此在双核机器上显示的数值需要除以核心数2;


3.top使用的是/proc/stat计算上面显示的cpu占用,使用/proc/*/stat计算每个进程占用的时间。但是计算的方式有所不同,代码较为复杂,但是目前确认为默认显示为Irix模式,即为相对于单个cpu core的占用的时间,如双核机器需要将该数值除以2*2计算,通过 shift+i可以进行切换;


通过上述说明可以解释珺方发现的问题:

问题1:首先,ps aux中两个compress进程占用cpu 15.5%+28.9%>40%,再加上其它进程,为何vmstat查看cpu空闲率id还能一直大于73%

ps的cpu占用率需要除以双核cpu数目为2,因此实际占用为(15.5%+28.9% )/2=22.2% ,也就约等于100%-73%;


问题2:其次,top命令显示的进程compress的cpu占用率和ps显示的数值差别很大,ps的cpu占用率雷打不动,一直是恒定值,top的比较动态, 难道ps aux显示的进程cpu占用率不可靠?

ps和top相差的数值为2倍关系,因此显示的占用率相差很大,同时变化率也会较大;


问题3:最后,这三个命令查出的cpu占用率相互之间均不统一,用哪一个更可靠?例如输入如下命令,粗体字是cpu占用率

这三个命令的占用率是统一的,按照如下公式进行计算时数据是一致的:

vmstat 的100%-idle == ps的cpu占用/cpu核心数 == top的cpu占用/cpu核心数/物理cpu数目;







我认为topas才是实时反映进程占用cpu使用率,而ps不是,所以你这个脚本好象不能实现你的需求。 


如果ps是,那么在业务高峰期,你看到的CPU使用率,应该更大,但实际上不是。你可以去观察你的系统,如果系统运行得越久,使用ps看到的进程CPU使用率好象会越小。





ps 看到的CPU占用率是进程自运行以来累计的CPU占用率,所以不准确,请使用topas




就目前AIX系统而言,是没有办法采用系统命令去获取进程实时的CPU使用率,只有采用topas才可以获取的到,但却无法记录下来。 

ps获取到%CPU是进程的实际CPU使用时间与进程运行期间的比,意味着运行时间越长,该值越不准确。 




ps 看到的CPU占用率是进程自运行以来累计的CPU占用率,所以不准确,请使用topas



ps命令确实有局限,ps aux看到的进程%CPU是该进程的全寿命均值,不是实时数据

我走了很多弯路,最后还是在AIX的命令大全中找到了简单的办法tprof




就不难理解了。ps是从进程开始就开始算的,是平均的占用率;而top是从上次刷新开始算的,一般几秒钟一刷,可以认为是即时的。而桌面系统我们一般更关注即时的,所以top的cpu占用率才是我需要的。而且top默认cpu的占用率的和并不是100%,而是核数x100%,所以有时会有一个进程占用超过100%的情况。


关于vmstat,top,ps aux查看的cpu占用率不一致的问题

标签:动态   统计   

原文地址:http://starbear.blog.51cto.com/87513/1769325

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!