top命令是linux下常用的工具,可以查看各个进程的CPU使用情况。先看一个实例:
这是Ramnode双核VPS的top显示结果:
左上角可以看到CPU的使用率是11.3%,但是看下面的进程,plugin-containe就占用了17.6%。出现这样的情况是因为11.3%指的是所有核心的占用情况,17.6%指的是运行当前进程的核心的使用率。有时候可以看到某个进程的使用率已经达到100%了,但是top显示的也只有50%而已。下面我们来做一个测试:
使用的命令是:
md5sum /dev/zero & |
执行上面命令的核心使用率超过了90%,左上角显示的CPU使用率只有50%多
在top窗口中,按数字键“1”就可以看到每个核心的使用情况。
杀掉MD5sum进程 用 kill pid即可
关于vmstat,top,ps aux查看的cpu占用率不一致的问题
op,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数目;