记录一次linux服务器负载高,其他资源正常的问题


问题描述:
有一个看到zabbix告警,某台服务器CPU负载超过了一定值。登录上去看下发现登录很顺畅。
使用top 查看发现:都很正常,只是有sy相对高一点点,但是不至于说会引起那么高的负载。
top - 10:52:51 up 25 days,  1:56,  2 users,  load average: 40.16, 30.17, 10.06(这几个值特别高)
Tasks: 1250 total(这值也很高),   1 running, 268 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.7%us,  0.3%sy,  0.0%ni, 97.2%id,  1.8%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   7937096k total,  7212300k used,   724796k free,   699944k buffers
Swap:  4194296k total,  2011628k used,  2182668k free,  1432324k cached

但是过了大概半个小时还是一个小时就自动降下来了。原因未知。


解决:确切的说没找到解决方法。只有排查思路,先记录等腾讯云排查
这种情况很大可能说明,有些命令或者有些操作在系统的任务列队当中,但是还没到执行的过程,所以它没有耗用到服务器其他的资源。对比其他机器会发现,total这个值也特别高,说明有些任务在等待的状态。
使用命令:ps aux|awk '{print $11}'|sort -n|uniq -c|sort -n
找出目前正在运行的一些任务,发现统计过程中有一个正在执行的命令有四五百个,lsblk -l。并且命令状态是D(含义是:无法中断的休眠状态(通常 IO 的进程))。
正常来说lsblk -l 只是查看磁盘而已,该命令应该是一下子就结束了的,但是不知道为何会一直没结束,手动执行的时候也是无法Ctrl+C来结束。可能是磁盘的问题,但是又没影响业务,并且是线上重要业务的机器,所以就没有检查磁盘,因为这个命令是腾讯云云监控脚本执行的,所以我们直接跟腾讯云那边说,后续复现的时候让他们检查!(前提是我们是VIP,可以直接在群里和他们沟通,方便快捷)

问题复现:排查结果是内核死锁。

我要看的是pid号是:16148

cat /proc/16148/stack 可以看到内核信息:

cat /proc/16148/status

State:  D (disk sleep)  --可以看到D状态(不可中断睡眠) 

在看下下面两个值:

voluntary_ctxt_switches:        254
nonvoluntary_ctxt_switches:     176 

voluntary_ctxt_switches表示自愿切换的次数,nonvoluntary_ctxt_switches表示强制切换的次数,两者都是自进程启动以来的累计值。也就是说会随着你这个进程运行的越久会越来越大。

一个进程的自愿切换占多数,意味着它对CPU资源的需求不高。如果一个进程的强制切换占多数,意味着对它来说CPU资源可能是个瓶颈。

从下面两个值可以判断进程挂死了。然后从上面的截图可以看到内核死锁导致的。

解决:重启机器,升级内核。


这种情况类似一种情况:
如果你的电脑挂载了nfs盘,如果nfs挂掉了,你再执行df -h的时候,命令就一直hang住,Ctrl+C也断不了。不同的是这种情况断开终端可以停止命令执行,但是我上面的情况是无法停止的。

猜你喜欢

转载自blog.csdn.net/MYF12/article/details/118786260