磁盘IO导致的Linux 内核错误 soft lockup-CPU 3 stuck for 22s!
一、背景
公司生产环境某应用程序所在的CENTOS虚拟主机的系统日志了同现如下日志提示:
kernel: BUG: soft lockup - CPU#3 stuck for 22s! [xxxx:48]
其中xxxx部分有多个不同类型的程序,如ksoftirqd,khugepaged,kworker,nginx,java等。
因为出现此错误提示时,相应的java应用服务通常也会出现访问不了的情况,于是公司的运维同事直接粗暴认为是相应的java程序代码写了死循环导致,但通过排查代码,并未有发现明显会出现死循环的代码逻辑。
二、内核软死锁(soft lockup)通常原因
通过网上查到相关信息,关于kernel: BUG: soft lockup,大部分的说法都说是说,因为CPU太忙导致喂狗(watchdog)不及时,此时系统会打印CPU死锁信息;这个bug没有让系统彻底死机,但是若干个进程(或者kernel thread)被锁死在了某个状态(一般在内核区域),很多情况下这个是由于内核锁的使用的问题。(但是据我所知,大部分的java程序都不会也不知道如何去调用系统的内核锁)。
按网上所述:Linux内核对于每一个cpu都有一个监控进程,在技术界这个叫做watchdog(看门狗)。通过ps –ef | grep watchdog能够看见,进程名称大概是watchdog/X(数字:cpu逻辑编号1/2/3/4之类的)。这个进程或者线程每一秒钟运行一次,否则会睡眠和待机。这个进程运行会收集每一个cpu运行时使用数据的时间并且存放到属于每个cpu自己的内核数据结构。在