soft lockup

目錄

报错 kernel:NMI watchdog: BUG: soft lockup

Soft lockup名稱解釋:所謂,soft lockup就是說,這個bug沒有讓系統徹底死機,但是若干個進程(或者kernel thread)被鎖死在了某個狀態(一般在內核區域),很多情況下這個是由於內核鎖的使用的問題。本文章教導您解決此問題。

現象描述

今天客戶系統發生狀況,描述為一台伺服器突然無法 ssh 連接,登錄伺服器帶外 IP 地址並進入遠程控制台界面後,提示 Authentication error,重啟後即可正常進入系統,進入後過20分鐘又進入死循環。

排查原因

ssh 登錄系統後無任何操作報錯如下:

				
					[root@lnmailplesk1 ~]#
Message from syslogd@lnmailplesk1 at Jul  5 15:27:44 ...
 kernel:NMI watchdog: BUG: soft lockup - CPU#2 stuck for 21s! [vmtoolsd:920]

Message from syslogd@lnmailplesk1 at Jul  5 15:42:11 ...
 kernel:NMI watchdog: BUG: soft lockup - CPU#7 stuck for 22s! [mariadbd:22743]

Message from syslogd@lnmailplesk1 at Jul  5 15:42:11 ...
 kernel:NMI watchdog: BUG: soft lockup - CPU#2 stuck for 22s! [kworker/2:1:22398]

Message from syslogd@lnmailplesk1 at Jul  5 15:42:15 ...
 kernel:NMI watchdog: BUG: soft lockup - CPU#0 stuck for 25s! [kworker/u16:1:22732]

Message from syslogd@lnmailplesk1 at Jul  5 15:54:41 ...
 kernel:NMI watchdog: BUG: soft lockup - CPU#5 stuck for 22s! [xfsaild/dm-0:461]

Message from syslogd@lnmailplesk1 at Jul  5 15:54:47 ...
 kernel:NMI watchdog: BUG: soft lockup - CPU#3 stuck for 28s! [kworker/u16:1:22732]

Message from syslogd@lnmailplesk1 at Jul  5 15:59:51 ...
 kernel:NMI watchdog: BUG: soft lockup - CPU#6 stuck for 21s! [kworker/u16:1:22732]

Message from syslogd@lnmailplesk1 at Jul  5 16:04:07 ...
 kernel:NMI watchdog: BUG: soft lockup - CPU#6 stuck for 21s! [mariadbd:19277]

Message from syslogd@lnmailplesk1 at Jul  5 16:04:20 ...
 kernel:NMI watchdog: BUG: soft lockup - CPU#0 stuck for 25s! [swapper/0:0]

Message from syslogd@lnmailplesk1 at Jul  5 16:13:22 ...
 kernel:NMI watchdog: BUG: soft lockup - CPU#0 stuck for 37s! [kworker/u16:3:19369]

Message from syslogd@lnmailplesk1 at Jul  5 16:17:51 ...
 kernel:NMI watchdog: BUG: soft lockup - CPU#0 stuck for 22s! [kworker/u16:1:22732]

Message from syslogd@lnmailplesk1 at Jul  5 16:22:04 ...
 kernel:NMI watchdog: BUG: soft lockup - CPU#2 stuck for 22s! [kworker/u16:3:19369]

Message from syslogd@lnmailplesk1 at Jul  5 16:22:15 ...
 kernel:NMI watchdog: BUG: soft lockup - CPU#0 stuck for 31s! [vmtoolsd:920]

Message from syslogd@lnmailplesk1 at Jul  5 16:27:20 ...
 kernel:NMI watchdog: BUG: soft lockup - CPU#5 stuck for 25s! [ksoftirqd/5:34]

Message from syslogd@lnmailplesk1 at Jul  5 16:27:20 ...
 kernel:NMI watchdog: BUG: soft lockup - CPU#0 stuck for 29s! [swapper/0:0]

Message from syslogd@lnmailplesk1 at Jul  5 16:42:40 ...
 kernel:NMI watchdog: BUG: soft lockup - CPU#4 stuck for 28s! [ksoftirqd/4:29]

Message from syslogd@lnmailplesk1 at Jul  5 16:47:06 ...
 kernel:NMI watchdog: BUG: soft lockup - CPU#3 stuck for 21s! [watchdog/3:22]

Message from syslogd@lnmailplesk1 at Jul  5 16:47:11 ...
 kernel:NMI watchdog: BUG: soft lockup - CPU#1 stuck for 21s! [migration/1:13]

Message from syslogd@lnmailplesk1 at Jul  5 16:52:58 ...
 kernel:NMI watchdog: BUG: soft lockup - CPU#1 stuck for 21s! [migration/1:13]

Message from syslogd@lnmailplesk1 at Jul  5 16:57:35 ...
 kernel:NMI watchdog: BUG: soft lockup - CPU#4 stuck for 22s! [ksoftirqd/4:29]

				
			

此資訊發現報錯為內核鎖死,簡稱“死機”

  • Soft lockup:這個bug沒有讓系統徹底死機,但是若干個進程(或者kernel thread)被鎖死在了某個狀態(一般在內核區域),很多情況下這個是由於內核鎖的使用的問題。
  • 內核參數kernel.watchdog_thresh(/proc/sys/kernel/watchdog_thresh)系統默認值為10。如果超過2*10秒會打印信息,注意:調整值時參數不能大於60。
  • Linux內核對於每一個cpu都有一個監控進程,在技術界這個叫做watchdog(看門狗)。通過ps –ef | grep watchdog能夠看見,進程名稱大概是watchdog/X(數字:cpu邏輯編號1/2/3/4之類的)。這個進程或者線程每一秒鐘運行一次,否則會睡眠和待機。

這個進程運行會收集每一個cpu運行時使用數據的時間並且存放到屬於每個cpu自己的內核數據結構。在內核中有很多特定的中斷函數。這些中斷函數會調用soft lockup計數,他會使用當前的時間戳與特定(對應的)cpu的內核數據結構中保存的時間對比,如果發現當前的時間戳比對應cpu保存的時間大於設定的閥值,他就假設監測進程或看門狗線程在一個相當可觀的時間還沒有執。

Cpu軟鎖為什麼會發生?

如果linux內核是經過精心設計安排的CPU調度訪問,那麼怎麼會產生cpu軟死鎖?那麼只能說由於用戶開發的或者第三方軟件引入,看我們服務器內核panic的原因就是qmgr進程引起。因為每一個無限的循環都會一直有一個cpu的執行流程(qmgr進程示一個後台郵件的消息隊列服務進程),並且擁有一定的優先級。

Cpu調度器調度一個驅動程序來運行,如果這個驅動程序有問題並且沒有被檢測到,那麼這個驅動程序將會暫用cpu的很長時間。

根據前面的描述,看門狗進程會抓住(catch)這一點並且拋出一個軟死鎖(soft lockup)錯誤。軟死鎖會掛起cpu使你的系統不可用。

內核參數kernel.watchdog_thresh(/proc/sys/kernel/watchdog_thresh)系統默認值為10。如果超過2*10秒會打印信息,注意:調整值時參數不能大於60。

雖然調整該值可以延長餵狗等待時間,但是不能徹底解決問題,只能導致信息延遲打印。因此問題的解決,還是需要找到根本原因。

可以打開panic,將/proc/sys/kernel/panic的默認值0改為1,便於定位。

解决方案

編輯 sysctl.conf 檔案

				
					vi /etc/sysctl.conf
				
			

在這裡面添加下面這行:

				
					kernel.watchdog_thresh=30
				
			

查看指令:

				
					tail -1 /proc/sys/kernel/watchdog_thresh
				
			

臨時生效指令:

				
					sysctl -w kernel.watchdog_thresh=30
				
			
TAKI Cloud 雲端主機
TAKI Cloud 雲端主機 只要470元起
TAKI Cloud 實體主機 Dedicated Server
TAKI Cloud 實體主機 只要4,500起
TAKI Cloud 中華電信 主機代管 服務
TAKI Cloud 主機代管 只要2,000元起

By taki

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *