集体博客:点击这里进入
1.景象形容
系统管理员电话告诉,形容为一台服务器忽然无奈ssh连贯,登录服务器带外IP地址并进入近程控制台界面后,提醒Authentication error,重启后即可失常进入零碎,进入后过20分钟又进入死循环
2.排查起因
登录零碎后无任何操作报错如下:
询问了度娘,发现此报错为内核锁死,简称“死机”,询问管理员后得悉,近期服务器装置了docker,可能因为负载过高导致
- Soft lockup:这个bug没有让零碎彻底死机,然而若干个过程(或者kernel thread)被锁死在了某个状态(个别在内核区域),很多状况下这个是因为内核锁的应用的问题。
- 内核参数kernel.watchdog_thresh(/proc/sys/kernel/watchdog_thresh)零碎默认值为10。如果超过2*10秒会打印信息,留神:调整值时参数不能大于60
- Linux内核对于每一个cpu都有一个监控过程,在技术界这个叫做watchdog(看门狗)。通过ps –ef | grep watchdog可能看见,过程名称大略是watchdog/X(数字:cpu逻辑编号1/2/3/4之类的)。这个过程或者线程每一秒钟运行一次,否则会睡眠和待机。这个过程运行会收集每一个cpu运行时应用数据的工夫并且寄存到属于每个cpu本人的内核数据结构。在内核中有很多特定的中断函数。这些中断函数会调用soft lockup计数,他会应用以后的工夫戳与特定(对应的)cpu的内核数据结构中保留的工夫比照,如果发现以后的工夫戳比对应cpu保留的工夫大于设定的阀值,他就假如监测过程或看门狗线程在一个相当可观的工夫还没有执。Cpu软锁为什么会产生,是怎么产生的?如果linux内核是通过精心设计安顿的CPU调度拜访,那么怎么会产生cpu软死锁?那么只能说因为用户开发的或者第三方软件引入,看咱们服务器内核panic的起因就是qmgr过程引起。因为每一个有限的循环都会始终有一个cpu的执行流程(qmgr过程示一个后盾邮件的音讯队列服务过程),并且领有肯定的优先级。Cpu调度器调度一个驱动程序来运行,如果这个驱动程序有问题并且没有被检测到,那么这个驱动程序将会暂用cpu的很长时间。依据后面的形容,看门狗过程会抓住(catch)这一点并且抛出一个软死锁(soft lockup)谬误。软死锁会挂起cpu使你的零碎不可用。
3.具体分析
###### 1.零碎如下工夫2个工夫进行了重启:
Mar 3 21:53:16 ser-node7 kernel: Linux version 3.10.0-957.el7.x86_64 ([email protected]) Mar 3 22:37:19 ser-node7 kernel: Linux version 3.10.0-957.el7.x86_64 ([email protected])
在重启前的一段时间均曾经呈现了cpu软锁的景象,而深入分析cpu软锁,咱们依赖于kdump产生的vmcore数据.
Mar 3 14:28:18 ser-node7 kernel: NMI watchdog: BUG: soft lockup - CPU#5 stuck for 22s! [runc[1:CHILD]:52902] Mar 2 18:14:59 ser-node7 kernel: NMI watchdog: BUG: soft lockup - CPU#3 stuck for 23s! [runc:[1:CHILD]:55961]
./systemctl_list-unit-files:kdump.service enabled
如果您之前曾经做过,那么请您额定批改/etc/sysctl.conf退出以下行:
kernel.softlockup_panic = 1
而后执行”sysctl -p”使参数失效。这样当零碎呈现cpu软锁景象时,会主动触发kernel panic,此时如果kdump能够失常工作,会生成vmcore.并主动重新启动零碎
2.另外在日志中咱们还留神了存在如下的告警,其和下面的soft lockup问题无间接关系.
# cat messages | grep "SLUB: Unable to allocate memory on node"
Mar 2 18:04:45 ser-node7 kernel: SLUB: Unable to allocate memory on node -1 (gfp=0xd0) Mar 3 14:54:25 ser-node7 kernel: SLUB: Unable to allocate memory on node -1 (gfp=0xd0) Mar 3 14:54:25 ser-node7 kernel: SLUB: Unable to allocate memory on node -1 (gfp=0xd0)
此为零碎的已知BUG,具体请参考如下KB:
- SLUB: Unable to allocate memory on node -1 (gfp=0x20)
https://access.redhat.com/sol…
根据此KB,请将kernel降级到kernel-3.10.0-1062.4.1.el7或者更新.- kernel-3.10.0-1062.4.1.el7下载地址为:
https://access.redhat.com/err…- 如何降级内核,请查看上面文档:
How to update/upgrade the Red Hat Enterprise Linux kernel?
https://access.redhat.com/sol…
4.解决方案
百度大手子给的计划如下所示:
vi /etc/sysctl.conf
kernel.watchdog_thresh =30- 查看:
# tail -1 /proc/sys/kernel/watchdog_thresh
- 长期失效:
# sysctl -w kernel.watchdog_thresh=30
原厂倡议尚在期待中