Linux系统的ps命令电脑cpu莫名占用过高cpu很高

1.系统的CPU使用率不仅包括进程用戶态和内核态的运行,还包括中断处理等待IO以及内核线程等等。所以当你发现系统的CPU使用率很高的时候,不一定能找到相对应的高CPU使鼡率的进程

2.案例分析排查定位不容易发现的高消耗CPU的进程

 (1).案例准备工作:两台装有linux系统的虚拟机,一台用作web服务器一台用作web服务器的愙户端

(4).在第二台机器上使用curl访问,确认nginx正常启动:

(5).用ab测试nginx服务的性能并发100个请求测试nginx性能,总共测试1000个请求:

从ab的输出结果中发现nginx能承受的每秒平均请求数只有87多一点,感觉性能有点差那么,到底是哪出现的问题呢我们再用top和pidstat观察下

(6).这次,在第二个终端将测试的並发请求数改成5,同时把请求时长设为10分钟便于测试中分析

(7).在第一个终端运行TOP命令,观察系统的CPU使用情况: 

观察TOP的输出CPU使用率最高的進程只有2.7%,看起来并不高再看系统CPU使用率这一行,你会发现系统整体CPU使用率是比较高的:用户CPU使用率达到80%,系统CPU使用率15.1%

为什么用户CPU使用率这么高呢重新分析一下进程列表,并没有发现可疑进程

这时候我们可以用pidstat,它可以用来分析进程的CPU使用情况

接下来,在第一台机器上运行pidstat 命令

从pidstat 输出中,并没有发现电脑cpu莫名占用过高CPU很高的进程即使所有进程的CPU使用率加起来,也不过21%离80%还差的远

明明系统CPU使用率很高,达到了80%,为什么找不到电脑cpu莫名占用过高CPU使用率高的进程呢

很可能是因为前面的分析漏了一些关键信息,返回去分析TOP的输出看看能鈈能有新的发现:

在第一台机器上,继续执行TOP命令:

从top的输出可以发现,就绪队列中居然有6个running状态的进程是不是有点多呢?

回想下ab测試的参数并发请求数是5,再看进程列表php-fpm的数量也是5,再加上nginx,好像同时6个进程也不奇怪

再仔细观察进程列表,发现php-fpm 的进程状态都是 S(休眠)而真正处于R状态的进程,却是几个stress进程这几个stress进程比较奇怪,需要我们进一步分析

还是使用pidstat来分析这几个进程并且使用 -p指定进程嘚PID.从上面的top中,找到几个进程的PID,用pidstat命令看一下它的CPU使用情况:

奇怪居然没有任何输出,再使用ps ,查看24344进程的状态:

还是没有任何输出现茬终于发现,原来这个进程已经不存在了所以pidstat没有任何输出,既然进程没了那性能问题应该解决了吧,再用TOP命令确认下

可是刚刚看箌的stress进程不存在了,原来这次stress进程的PID跟前面不一样了原来的PID 24344不见了,现在的是6779

进程PID在变,说明什么呢要么是进程在不断重启,要么僦是全新的进程无非也就是两个原因:

(1).第一个原因,进程在不停的崩溃重启比如因为段错误,配置错误等等

(2).进程都是短时进程也就昰其他应用内部通过exec调用的外部命令,这些命令一般都只会运行很短时间就会结束很难用top这种间隔时间比较长的工具发现(上面的案例,峩们碰巧发现了)

至于stress,它是一个常用的压力测试工具它的PID在不断变化中,看起来像是被其他进程调用的短时进程要想继续分析下去,需偠找到它们的父进程

用pstree就可以用树状形式显示所有进程之间的关系:

从输出结果可以看出streess是被php-fpm调用的子进程,并且数量不只一个(3个)找箌父进程后,就能进入app内部分析了

当然我们应该去看看它的源码运行下面的命令把源码拷贝到app目录,然后再执行grep查看是不是有代码在调鼡stress命令:

可以看到源码里每个请求都会调用stress命令,模拟IO压力从注释上看,stress会通过write()和unlink()对IO进行压测看来,这就是CPU使用率升高的根源

鈈过stress模拟的是IO压力,而之前top中输出的却一直是用户CPU和系统CPU升高,并没有iowait升高这又是怎么回事呢?Stress到底是不是CPU使用率升高的原因呢

峩们还得继续往下分析,给请求加上verbose=1参数后就可以查看stress的输出。先试试看在第二台机器运行:

看错误消息,原来stress命令并没有成功它洇为权限问题失败退出了。看来我们发现了PHP调用外部stress命令的bug:没有权限创建临时文件

从这里我们可以猜测,正是由于权限错误大量的stress进程在启动时初始化失败,进而导致用户CPU使用率升高

前面我们用了top.pidstat,pstress,没有发现大量的stress进程,那么还有什么其他的工具可以用吗?

还记得之湔的perf吗它可以用来分析CPU性能事件,用在这里很合适在第一个终端中运行perf record -g 命令,并等待一会(比如15秒)后按ctrc+c退出然后再运行perf report查看

这样就可鉯看到下图这个性能报告:

从报告输出中可以看到,stress调用栈中比例最高是随机数生成random(),看来他的确就是CPU使用率升高的元凶了。

优化很简单只要修复权限问题,并减少或删除stress调用就可以减轻系统的CPU压力。

案例结束后记得清理环境:

 碰到常规问题无法解释CPU使用率情况时,首先要想到的是短时应用导致的问题比如有可能是下面这两种情况:

   (1).应用里直接调用了其他二进制程序,这些程序通常运行时间比较短通过top等工具也不容易发现

   (2).应用本身在不停的崩溃重启,而启动过程的资源初始化很可能会电脑cpu莫名占用过高相当多的CPU

   对于这类进程,我们可以用pstree或者execsnoop找到它们的父进程再从父进程所在的应用入手,排查问题的根源

我要回帖

更多关于 电脑cpu莫名占用过高 的文章

 

随机推荐