背景:
在一次查看服务器监控的时候偶然发现其中一台服务器的CPU负载很高,但是CPU利用率基本没有,通过top命令完全看不出来问题所在,经过一些思路的排查发现了原因并处理,现记录下来。
现象:
top命令查看:
作为CPU负载1分钟,5分钟,15分钟高达5,而且还持续的一两天的时间了(这里没显示是因为当时没截图)。
按照以前经验,cpu负载高而利用率不高,大概率是io导致的。因为io读写的瓶颈会导致CPU的长时间排队等待,造成负载高,CPU利用率反而不高,这项问题通常会体现在top命令里的wa上。但是,上面截图wa的利用率基本为0,这就很奇怪了,因此有了以下的排查思路。
排查思路:
既然top里的各项参数看起来完全正常,以我浅薄的知识量就的想到了在top里看不到的参数,同时也是造成cpu问题的原因之一的上下文切换。
命令:
vmstat 1
这个命令我第一眼看的关键参数就是in,cs
in是每秒中断数
cs是上下文切换数量
第一眼看到这个数量是觉得挺多的,就在想会不会是这个导致的,于是开始寻找这上下文切换的进程是哪个,只要处理掉就可以解决了。
命令:
pidstat -wt 1
-w 是指显示进程的上下文切换情况
-t 是指同时显示进程下线程。
因为linux里面最小执行单位是线程,因此在要加一个-t参数才能显示完整。
经过一些过滤计算,发现是aliyundun这个进程占用的最多,但是这个服务是阿里云自带的防护进程,一般不会突然出问题。 但是不管三七二十一,先干掉再说。
然而事情没这么简单,负载依旧很高!有点没辙了,查各种资料,回头看vmstat下的参数发现r这项基本没有问题,都是低于CPU的核数,因此总结为不是多进程等待和切换导致的。 r是指等待运行的进程数。
然后就想到了是不是有不可中断进程,因为不可中断进程表示进程正在跟硬件交互,为了保护进程数据和硬件的一致性,系统不允许其他进程或中断打断这个进程,因此会一直占用CPU,不可中断是D,因此执行命令:
ps -A -ostat,ppid,pid,cmd|grep -e '^D'
发现有两个进程正处于这个状态,而且这两个都是很基础的命令,当时是因为其他原因导致的。杀掉进程后,果然负载降下来了,问题解决。
原因
不可中断进程导致CPU负载高,通过命令:
ps -A -ostat,ppid,pid,cmd|grep -e '^D'
找到进程,杀掉即可。