读书人

关于vmstat,top,ps aux查看的cpu占用率

发布时间: 2012-06-28 15:20:03 作者: rapoo

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

转载:关于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也使用了/proc/*/stat文件进行计算。

1.vmstat对于cpu idle的计算方式比较复杂,但是显示的为平均值,即使用cpu使用时间片的差值/时间间隔/cpu个数(为物理cpu数目*cpu核心数),其中时间间隔为vmstat后加的参数,如vmstat 10就为10s内的平均cpu 占用率;

2.ps计算的为每个进程的cpu占用时间,使用的为/proc/*/stat文件,其中*为进程号,计算方式为使用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数目;

读书人网 >软件架构设计

热点推荐