個人博客:點擊這里進入
1.現象描述
系統管理員電話通知,描述為一台服務器突然無法ssh連接,登錄服務器帶外IP地址並進入遠程控制台界面后,提示Authentication error,重啟后即可正常進入系統,進入后過20分鍾又進入死循環
2.排查原因
登錄系統后無任何操作報錯如下:
詢問了度娘,發現此報錯為內核鎖死,簡稱“死機”,詢問管理員后得知,近期服務器安裝了docker,可能由於負載過高導致
- 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使你的系統不可用。
3.具體分析
1.系統如下時間2個時間進行了重啟:
Mar 3 21:53:16 ser-node7 kernel: Linux version 3.10.0-957.el7.x86_64 (mockbuild@x86040.build.eng.bos.redhat.com)
Mar 3 22:37:19 ser-node7 kernel: Linux version 3.10.0-957.el7.x86_64 (mockbuild@x86040.build.eng.bos.redhat.com)
在重啟前的一段時間均已經出現了cpu軟鎖的現象,而深入分析cpu軟鎖,我們依賴於kdump產生的vmcore數據.
Mar 3 14:28:18 ser-node7 kernel: NMI watchdog: BUG: soft lockup - CPU#5 stuck for 22s! [runc[1:CHILD]:52902]
Mar 2 18:14:59 ser-node7 kernel: NMI watchdog: BUG: soft lockup - CPU#3 stuck for 23s! [runc:[1:CHILD]:55961]
./systemctl_list-unit-files:kdump.service enabled
如果您之前已經做過,那么請您額外修改/etc/sysctl.conf加入以下行:
kernel.softlockup_panic = 1
然后執行"sysctl -p"使參數生效。這樣當系統出現cpu軟鎖現象時,會自動觸發kernel panic,此時如果kdump可以正常工作,會生成vmcore.並自動重新啟動系統
2.另外在日志中我們還注意了存在如下的告警,其和上面的soft lockup問題無直接關系.
# cat messages | grep "SLUB: Unable to allocate memory on node"
Mar 2 18:04:45 ser-node7 kernel: SLUB: Unable to allocate memory on node -1 (gfp=0xd0)
Mar 3 14:54:25 ser-node7 kernel: SLUB: Unable to allocate memory on node -1 (gfp=0xd0)
Mar 3 14:54:25 ser-node7 kernel: SLUB: Unable to allocate memory on node -1 (gfp=0xd0)
此為系統的已知BUG,具體請參考如下KB:
- SLUB: Unable to allocate memory on node -1 (gfp=0x20)
https://access.redhat.com/solutions/4088471
依據此KB,請將kernel升級到kernel-3.10.0-1062.4.1.el7或者更新. - kernel-3.10.0-1062.4.1.el7下載地址為:
https://access.redhat.com/errata/RHSA-2019:3055 - 如何升級內核,請查看下面文檔:
How to update/upgrade the Red Hat Enterprise Linux kernel?
https://access.redhat.com/solutions/20366
4.解決方案
百度大手子給的方案如下所示:
vi /etc/sysctl.conf
kernel.watchdog_thresh =30- 查看:
# tail -1 /proc/sys/kernel/watchdog_thresh
- 臨時生效:
# sysctl -w kernel.watchdog_thresh=30
原廠建議尚在等待中