关于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%的情况。

时间: 2024-10-10 14:14:16

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

Linux下如何查看高CPU占用率线程 LINUX CPU利用率计算

目录(?)[-] proc文件系统 proccpuinfo文件 procstat文件 procpidstat文件 procpidtasktidstat文件 系统中有关进程cpu使用率的常用命令 ps 命令 top命令 单核情况下Cpu使用率的计算 基本思想 总的Cpu使用率计算 计算方法 某一进程Cpu使用率的计算 计算方法 实验数据 某一线程Cpu使用率的计算 计算方法 实验数据 多核情况下cpu使用率的计算 实验一 描述 数据一 数据二 实验二 描述 数据一 数据二 主要问题 Java 系统

TOP CPU占用率原理及与实时线程的冲突

linux下通过top或vmstat查看系统CPU占用率,在大多数情况下测得的CPU占用率是准确的,但在时间精度较高的实时linux系统中,top测量的CPU占用率可能会不准确,下面结合top原理和实时linux实例分析在实时系统中top的使用情况. 统计CPU占用率的时候,大致统计以下几个时间: 用户时间(User time).系统时间(System time).等待时间(Waiting time).空闲时间(Idle time).Nice时间.硬件终端处理时间等 其中主要计算用户时间.系统时

ps -ef/ps -aux 查看正在活动的进程

ps -ef 查看正在活动的进程 ps -ef |grep abc 查看含有"abc"的活动进程 ps -ef |grep -v abc 查看不含abc的活动进程 1)ps a 显示现行终端机下的所有程序,包括其他用户的程序. 2)ps -A 显示所有程序. 3)ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示. 4)ps -e 此参数的效果和指定"A"参数相同. 5)ps e 列出程序时,显示每个程序所使用的环境变量. 6)ps

ps aux 查看进程信息

[[email protected] Desktop]# ps auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.3 192096 7456 ? Ss 03:03 0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 21root 2 0.0 0.0 0 0 ? S 03:03 0:00 [kthreadd] [[email

云服务器 ECS Linux 系统 CPU 占用率较高问题排查思路

https://help.aliyun.com/knowledge_detail/41225.html?spm=5176.7841174.2.2.ifP9Sc 注意:本文相关配置及说明已在 CentOS 6.5 64 位操作系统中进行过测试.其它类型及版本操作系统配置可能有所差异,具体情况请参阅相应操作系统官方文档. 如果云服务器 ECS Linux 系统的 CPU 持续跑高,则会对系统稳定性和业务运行造成影响.本文对 CPU 占用率较高问题的排查分析做简要说明. CPU 负载查看方法 使用 v

Linux CPU占用率监控工具小结

关键词:top.perf.sar.ksar.mpstat.uptime.vmstat.pidstat.time.cpustat.xload.munin.htop.glances.atop. 1. top top是最常用的查看系统资源使用情况的工具,包括CPU.内存等等资源. 这里主要关注CPU资源. 1.1 /proc/loadavg load average取自/proc/loadavg. 9.53 9.12 8.37 3/889 28165 前三个数字是1.5.15分钟内进程队列中平均进程数

Linux环境下进程的CPU占用率

阿里云服务器网站:https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=qqwovx6h 文字来源:http://www.samirchen.com/linux-cpu-performance/ 1.Linux 环境下查看 CPU 信息 1.1.查看 CPU 详细信息 通过 cat /proc/cpuinfo 命令,可以查看 CPU 相关的信息: [[email protected]~]$cat/proc/cpuinfo

线上Java程序导致服务器CPU占用率过高的问题排除过程

博文转至:http://www.jianshu.com/p/3667157d63bb,博文更好效果看原版,转本博文的目的就算是个书签吧,需要时候可以定位原文学习 1.故障现象 客服同事反馈平台系统运行缓慢,网页卡顿严重,多次重启系统后问题依然存在,使用top命令查看服务器情况,发现CPU占用率过高. 2.CPU占用过高问题定位 2.1.定位问题进程 使用top命令查看资源占用情况,发现pid为14063的进程占用了大量的CPU资源,CPU占用率高达776.1%,内存占用率也达到了29.8% [[

linux上限制用户进程数、cpu占用率、内存使用率

限制进程CPU占用率的问题,给出了一个shell脚本代码如下: renice +10 `ps aux | awk '{ if ($3 > 0.8 && id -u $1 > 500) print $2}'` 其中用到ps获取进程信息,其实 ps中%CPU一列的意义是进程实际占有CPU时间和它存活时间的比值,这个值能反应进程对CPU的消耗,但不能准确反应进程所占CPU时间占整个系统CPU的百分比. 而top输出中的%CPU这一列正是进程所占CPU时间占整个系统CPU的百分比,用于