kernel:NMI watchdog: BUG: soft lockup - CPU#0 stuck for 23s! [kblockd:19]

近期在服务器跑大量高负载程序,形成cpu soft lockup。若是确认不是软件的问题。
在这里插入图片描述
解决办法:html

#追加到配置文件中node

echo 30 > /proc/sys/kernel/watchdog_thresh

#查看git

[root@git-node1 data]# tail -1 /proc/sys/kernel/watchdog_thresh
30

#临时生效web

sysctl -w kernel.watchdog_thresh=30

#内核软死锁(soft lockup)bug缘由分析服务器

Soft lockup名称解释:所谓,soft lockup就是说,这个bug没有让系统完全死机,可是若干个进程(或者kernel thread)被锁死在了某个状态(通常在内核区域),不少状况下这个是因为内核锁的使用的问题。svg

vi /etc/sysctl.conf
 
kernel.watchdog_thresh=30

参考文章:函数

CentOS内核,对应的文件是/proc/sys/kernel/watchdog_thresh。
CentOS内核和标准内核还有一个地方不同,就是处理CPU占用时间过长的函数,CentOS下是watchdog_timer_fn()函数。
若是你的内核是标准内核的话,能够经过修改/proc/sys/kernel/softlockup_thresh来修改超时的阈值
参考文献:https://zhidao.baidu.com/question/1829924822713415300.htmlthis

首先,这条信息能够输出,说明即便发生死锁或者死循环,仍是有代码能够执行。第二,能够经过这个日志信息,找到对应的处理函数,这个函数所在的模块就是用来处理CPU被过分使用时用到的。因此经过这个事情,能够看到内核打印出的只言片语都有可能成为你解决问题的关键,必定要从重视这些信息,从中找出有用的东西。
我常常看的内核版本是官方的2.6.32内核,这个版本中我找到的函数是softlockup_tick(),这个函数在时钟中断的处理函数run_local_timers()中调用。这个函数会首先检查watchdog线程是否被挂起,若是不是watchdog线程,会检查当前占有CPU的线程占有的时间是否超过系统配置的阈值,即softlockup_thresh。若是当前占有CPU的时间过长,则会在系统日志中输出咱们上面看到的那条日志。接下来才是最关键的,就是输出模块信息、寄存器信息和堆栈信息,检查softlockup_panic的值是否为1。若是softlockup_panic为1,则调用panic()让内核挂起,输出OOPS信息。代码以下所示:线程

/** This callback runs from the timer interrupt, and checks日志

  • whether the watchdog thread has hung or not:*/void softlockup_tick(void){int this_cpu = smp_processor_id(); unsigned long
    touch_timestamp = per_cpu(touch_timestamp, this_cpu); unsigned long
    print_timestamp; struct pt_regs regs = get_irq_regs(); unsigned long
    now; /
    Warn about unreasonable delays: */ if (now <= (touch_timestamp
  • softlockup_thresh))return; per_cpu(print_timestamp, this_cpu) = touch_timestamp; spin_lock(&print_lock); printk(KERN_ERR BUG: soft
    lockup - CPU#%d stuck for %lus! [%s:%d]\n, this_cpu, now -
    touch_timestamp, current-comm, task_pid_nr(current)); print_modules();
    print_irqtrace_events(current);if
    (regs)show_regs(regs);elsedump_stack(); spin_unlock(&print_lock); if
    (softlockup_panic) panic(softlockup: hung tasks);}

可是softlockup_panic的值默认居然是0,因此在出现死锁或者死循环的时候,会一直只输出日志信息,而不会宕机,这个真是好坑啊!因此你得手动修改/proc/sys/kernel/softlockup_panic的值,让内核能够在死锁或者死循环的时候能够宕机。若是你的机器中安装了kdump,在重启以后,你会获得一分内核的core文件,这时从core文件中查找问题就方便不少了,并且不再用手动重启机器了。若是你的内核是标准内核的话,能够经过修改/proc/sys/kernel/softlockup_thresh来修改超时的阈值,若是是CentOS内核的话,对应的文件是/proc/sys/kernel/watchdog_thresh。CentOS内核和标准内核还有一个地方不同,就是处理CPU占用时间过长的函数,CentOS下是watchdog_timer_fn()函数。
这里介绍下lockup的概念。lockup分为soft lockup和hard lockup。 soft lockup是指内核中有BUG致使在内核模式下一直循环的时间超过10s(根据实现和配置有所不一样),而其余进程得不到运行的机会。hard softlockup是指内核已经挂起,能够经过watchdog这样的机制来获取详细信息。

转载:https://www.cnblogs.com/nulige/p/8000490.html