Linux内核报错解决办法:kernel:NMI watchdog: BUG: soft lockup - CPU#0 stuck for 30s

内核软死锁(soft lockup)

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

出现死锁原因

1、CPU高负载时间过长
2、服务器电源供电不足,导致CPU电压不稳定
3、vcpus超过物理cpu cores
4、虚机所在的宿主机的CPU太忙或磁盘IO太高
5、虚机机的CPU太忙或磁盘IO太高
6、VM网卡驱动存在bug,处理高水位流量时存在bug导致CPU死锁
7、BIOS开启了超频,导致超频时电压不稳,容易出现CPU死锁
8、Linux kernel或KVM存在bug
9、BIOS Intel C-State开启导致,关闭可解决
10、BIOS spread spectrum开启导致

当主板上的时钟震荡发生器工作时,脉冲的尖峰会产生emi(电磁干扰)。spread spectrum(频展)设定功能可以降低脉冲发生器所产生的电磁干扰,脉冲波的尖峰会衰减为较为平滑的曲线。
如果我们没有遇到电磁干扰问题,建议将此项设定为disabled,这栏可以优化系统的性能表现和稳定性;
否则应该将此项设定为enabled。 如果对cpu进行超频,必须将此项禁用。因为即使是微小的脉冲值漂移也会导致超频运行的cpu锁死。CPU超频时,SPREAD SPECTRUM必须关闭,否则容易出现锁死cpu的情况。

Linux内核死锁检测机制

死锁就是多个进程(线程)因为等待别的进程已占有的自己所需要的资源而陷入阻塞的一种状态,死锁状态一旦形成,进程本身是解决不了的,需要外在的推动,才能解决,最重要的是死锁不仅仅影响进程业务,而且还会占用系统资源,影响其他进程。所以内核中设计了内核死锁检测机制,一旦发现死锁进程,就重启OS,快刀斩乱麻解决问题。之所以使用重启招数,还是在于分布式系统中可以容忍单点崩溃,不能容忍单点进程计算异常,否则进行死锁检测重启OS就得不偿失了。

解决办法 

echo 30 > /proc/sys/kernel/watchdog_thresh
echo "kernel.watchdog_thresh=30" >> /etc/sysctl.conf 
sysctl -w kernel.watchdog_thresh=30
sysctl -q vm.swappiness
sysctl -p
# Stop MySQL startup
sudo systemctl stop mysqld
sudo systemctl disable mysqld

分布式系统最直接的方法是重启Linux,重新开启进程

参考:

https://blog.csdn.net/sunny05296/article/details/82858071

扫描二维码关注公众号,回复: 11415598 查看本文章

https://www.cnblogs.com/fusheng11711/p/10767190.html

http://oenhan.com/kernel-deadlock-check

猜你喜欢

转载自blog.csdn.net/qq262593421/article/details/107142262
今日推荐