服务器内核软死锁(soft lockup)

概述

简单记录下最近处理的一个内核软死锁(soft lockup)问题,仅供参考。


1、检查系统信息

 
 grep -C 5 "NMI watchdog: BUG" /var/log/messages

服务器异常卡顿,但CPU、内存等资源都是正常的,观察系统日志提示NMI watchdog: BUG: soft lockup - CPU#4 stuck for 21s! [java:1782]

记一次服务器内核软死锁(soft lockup)解决方案

 


2、内核软死锁(soft lockup)bug原因分析

Soft lockup名称解释:所谓,soft lockup就是说,这个bug没有让系统彻底死机,但是若干个进程(或者kernel thread)被锁死在了某个状态(一般在内核区域),很多情况下这个是由于内核锁的使用的问题。

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、解决方案

CentOS内核,对应的文件是/proc/sys/kernel/watchdog_thresh。

CentOS内核和标准内核还有一个地方不一样,就是处理CPU占用时间过长的函数,CentOS下是watchdog_timer_fn()函数。

如果你的内核是标准内核的话,可以通过修改/proc/sys/kernel/softlockup_thresh来修改超时的阈值

-- 永久生效
echo 30 > /proc/sys/kernel/watchdog_thresh 
-- 临时生效
sysctl -w kernel.watchdog_thresh=30

转自https://www.toutiao.com/i6853417975874060811/?timestamp=1602810719&app=news_article&group_id=6853417975874060811&use_new_style=1&req_id=202010160911590100120611671D3396D0 

原文地址:https://www.cnblogs.com/cangqinglang/p/13824648.html