內核軟死鎖(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,重新開啟進程