概述
簡單記錄下最近處理的一個內核軟死鎖(soft lockup)問題,僅供參考。
1、檢查系統信息
grep -C 5 "NMI watchdog: BUG" /var/log/messages
服務器異常卡頓,但CPU、內存等資源都是正常的,觀察系統日志提示NMI watchdog: BUG: soft lockup - CPU#4 stuck for 21s! [java:1782]
2、內核軟死鎖(soft lockup)bug原因分析
Soft lockup名稱解釋:所謂,soft lockup就是說,這個bug沒有讓系統徹底死機,但是若干個進程(或者kernel thread)被鎖死在了某個狀態(一般在內核區域),很多情況下這個是由於內核鎖的使用的問題。
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使你的系統不可用。
3、解決方案
CentOS內核,對應的文件是/proc/sys/kernel/watchdog_thresh。
CentOS內核和標准內核還有一個地方不一樣,就是處理CPU占用時間過長的函數,CentOS下是watchdog_timer_fn()函數。
如果你的內核是標准內核的話,可以通過修改/proc/sys/kernel/softlockup_thresh來修改超時的閾值
-- 永久生效 echo 30 > /proc/sys/kernel/watchdog_thresh -- 臨時生效 sysctl -w kernel.watchdog_thresh=30
轉自https://www.toutiao.com/i6853417975874060811/?timestamp=1602810719&app=news_article&group_id=6853417975874060811&use_new_style=1&req_id=202010160911590100120611671D3396D0
喜歡這篇文章?歡迎打賞~~

