linux cpu高负载,top中没有高占用cpu的进程。

cpu为16核的,load average负载稳定在12左右.
用top查看没有任何高占用cpu的进程存在。
请问如何查找问题所在?
截图为连续的3个截图 可以看到最占用cpu的就是php-fpm和nginx 这两个,但作为web服务器 占用1%并不算高。top中也使用了P来排序,始终找不到对应的进程。也重启过,没有解决问题,top截图是在root用下操作的。是否存在进程隐藏,服务器被黑的可能呢?图片描述
图片描述

感谢您的回答:
系统信息:Linux web02 2.6.18-407.el5xen #1 SMP Wed Nov 11 08:54:02 EST 2015 x86_64 x86_64 x86_64 GNU/Linux,目前我正在想办法安装perf,我这边yum坏掉了,我正在想办法。
先贴上vmstat的信息吧。看起来io是不高的。图片描述

贴上iotop和iostat的信息 感觉io的影响不大,我这是centos5.6所以perf找不到合适的版本来用了。目前看还是cpu莫名的高 16核 75%us还是太高了图片描述图片描述

对的,作为web服务器我把web服务关掉了,负载也没有变化始终这么高,系统确实比较老,5.5的centos mirror都不支持了,主要是手头上还有几个和这个系统一样的,分别的别的web服务器,数据库服务器,4-5台吧。。 系统,配置都差不多,唯独这台cpu始终占用高。。top中看不到进程,实在不知道从哪下手查找问题。 从网络流量看? 从防火墙?还是别的方面。

阅读 16.5k
3 个回答

ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu
我搜到了这样一个命令,然后在结果中看到了看了占用cpu的进程,是系统的占用,
root 30849 1 30858 03:16:37 99.7 [kacpi_notify]
root 30849 1 30859 03:16:35 99.7 [kacpi_notify]
root 30849 1 30860 03:16:36 99.7 [kacpi_notify]
root 30849 1 30861 03:16:37 99.7 [kacpi_notify]
root 30849 1 30863 03:16:37 99.7 [kacpi_notify]
root 30849 1 30864 03:16:38 99.7 [kacpi_notify]
root 30849 1 30865 03:16:36 99.7 [kacpi_notify]
root 30849 1 30866 03:16:38 99.7 [kacpi_notify]
在iotop中是可以看到这个进程的,但是io中没有cpu占用,top中看不到 [kacpi_notify] acpi进程的通知进程 acpi是电源的接口,应该是机器太老的原因 ,用了十几年的机器了。

load average还包含了不可中断睡眠的进程,用iostat看看是不是在执行磁盘IO。

主要是user用户态占用,可以用perf top看一下热点函数,根据热点函数可以进一步推断可能属于哪个进程或程序。
perf工具当前主流的发行版都会有,但如果版本较老可能就没有了。题主最好贴一下系统的版本信息。
类似下面这种:

hidtak@hidtak:~$ uname -a
Linux hidtak 4.15.0-20-generic #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

Intel的VTune是另外一种方法(试用版即可),老版本也可以用。


2018.5.31更新:
题主的内核版本太老了,perf至少3.0内核以上才支持。

这种问题分析起来比较麻烦,因为可能是底层的代码BUG或机制缺陷;低版本内核缺乏一些分析工具和手段,就更麻烦了。

我觉得只能采用比较笨的排除法了,因为题主提到过重启后也会复现。(是立即复现?还是做了什么操作后?还是有了业务请求后?)。
那么系统启动过程中会拉起一系列的服务和应用。一个个关闭排除就好了。


另外从原理上讲2.6内核版本统计CPU(核)占用率就是读取/proc/stat文件,统计进程的占用率是读取/proc/<pid>/stat文件。

那么我能想到的可能有几种情况:

1)TOP的BUG,没显示全?或者排序方式不对?默认是按照CPU排序啊!
这个容易确认,只需要看/proc下所有pid是否都在TOP中显示了。注意TOP是分页的;可以用top批处理选项,输出到一个文件中。

2)内核或底层代码BUG。
可以通过Google相关案例看看,说不定可以找到类似BUG案例。

3)内核被黑客攻击了,并且注入了恶意代码,导致/proc/内没有对应PID的节点生成,TOP读取不到进程信息。
黑客一般不会单单占用一下CPU,通常会向外发送信息,否则对他也没啥实际意义,所以可以通过监控一下网络活动看看是否有些痕迹,例如可以通过抓包看看是否有异常的网络地址,异常的数据收发行为。
当然也有可能就是一个单纯消耗CPU的病毒。
无论是病毒或木马,重启之后也存在,说明它在磁盘上有执行文件,并且设置了自动启动,在启动配置里面肯定有体现,可以通过排除法也可以找到它。

以上供参考。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏