内核软死锁
Posted bugutian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内核软死锁相关的知识,希望对你有一定的参考价值。
内核软死锁(soft lockup)
转载自:
CSDN静谧星空:https://blog.csdn.net/qq262593421/article/details/107142262
参考地址:
https://blog.csdn.net/sunny05296/article/details/82858071
https://www.cnblogs.com/fusheng11711/p/10767190.html
http://oenhan.com/kernel-deadlock-check
虚拟机终端报死锁:
[root@node1 ~]#
Message from syslogd@node1 at Jul 15 10:09:53 ...
kernel:NMI watchdog: BUG: soft lockup - CPU#4 stuck for 35s! [kworker/4:2:530]
Message from syslogd@node1 at Jul 15 10:09:54 ...
kernel:NMI watchdog: BUG: soft lockup - CPU#2 stuck for 47s! [safe_timer:2422]
Message from syslogd@node1 at Jul 15 10:09:54 ...
kernel:NMI watchdog: BUG: soft lockup - CPU#3 stuck for 35s! [ms_pipe_write:2891]
Message from syslogd@node1 at Jul 15 10:09:54 ...
kernel:NMI watchdog: BUG: soft lockup - CPU#1 stuck for 35s! [tuned:1735]
Message from syslogd@node1 at Jul 15 10:09:54 ...
kernel:NMI watchdog: BUG: soft lockup - CPU#0 stuck for 47s! [tp_osd_tp:2676]
Message from syslogd@node1 at Jul 15 10:09:54 ...
kernel:NMI watchdog: BUG: soft lockup - CPU#5 stuck for 35s! [kworker/5:1:65]
You have new mail in /var/spool/mail/root
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
sudo systemctl stop mysqld
sudo systemctl disable mysqld
分布式系统最直接的方法是重启Linux,重新开启进程
以上是关于内核软死锁的主要内容,如果未能解决你的问题,请参考以下文章
CString 使用加上内核中的 HeapWalk 和 HeapLock/HeapUnlock 死锁