報錯kernel:NMI watchdog: BUG: soft lockup

報錯kernel:NMI watchdog: BUG: soft lockup - CPU#0 stuck for 26s

近期在服務器跑大量高負載程序,形成cpu soft lockup。若是確認不是軟件的問題。html

解決辦法:node

#追加到配置文件中git

echo 30 > /proc/sys/kernel/watchdog_thresh 服務器

#查看函數

[root@git-node1 data]# tail -1 /proc/sys/kernel/watchdog_thresh
30this

#臨時生效spa

sysctl -w kernel.watchdog_thresh=30線程

 

#內核軟死鎖(soft lockup)bug緣由分析日誌

Soft lockup名稱解釋:所謂,soft lockup就是說,這個bug沒有讓系統完全死機,可是若干個進程(或者kernel thread)被鎖死在了某個狀態(通常在內核區域),不少狀況下這個是因爲內核鎖的使用的問題。code

 

vi /etc/sysctl.confkernel.watchdog_thresh=30

 

參考文章:

CentOS內核,對應的文件是/proc/sys/kernel/watchdog_thresh。
CentOS內核和標準內核還有一個地方不同,就是處理CPU佔用時間過長的函數,CentOS下是watchdog_timer_fn()函數。
若是你的內核是標準內核的話,能夠經過修改/proc/sys/kernel/softlockup_thresh來修改超時的閾值
參考文獻:https://zhidao.baidu.com/question/1829924822713415300.html
首先,這條信息能夠輸出,說明即便發生死鎖或者死循環,仍是有代碼能夠執行。第二,能夠經過這個日誌信息,找到對應的處理函數,這個函數所在的模塊就是用來處理CPU被過分使用時用到的。因此經過這個事情,能夠看到內核打印出的隻言片語都有可能成爲你解決問題的關鍵,必定要從重視這些信息,從中找出有用的東西。
我常常看的內核版本是官方的2.6.32內核,這個版本中我找到的函數是softlockup_tick(),這個函數在時鐘中斷的處理函數run_local_timers()中調用。這個函數會首先檢查watchdog線程是否被掛起,若是不是watchdog線程,會檢查當前佔有CPU的線程佔有的時間是否超過系統配置的閾值,即softlockup_thresh。若是當前佔有CPU的時間過長,則會在系統日誌中輸出咱們上面看到的那條日誌。接下來纔是最關鍵的,就是輸出模塊信息、寄存器信息和堆棧信息,檢查softlockup_panic的值是否爲1。若是softlockup_panic爲1,則調用panic()讓內核掛起,輸出OOPS信息。代碼以下所示:/** This callback runs from the timer interrupt, and checks
* whether the watchdog thread has hung or not:*/void softlockup_tick(void){int this_cpu = smp_processor_id();
unsigned long touch_timestamp = per_cpu(touch_timestamp, this_cpu);
unsigned long print_timestamp;
struct pt_regs *regs = get_irq_regs();
unsigned long now;
/* Warn about unreasonable delays: */
if (now <= (touch_timestamp + softlockup_thresh))return;
per_cpu(print_timestamp, this_cpu) = touch_timestamp;
spin_lock(&print_lock);
printk(KERN_ERR BUG: soft lockup - CPU#%d stuck for %lus! [%s:%d]\n,
this_cpu, now - touch_timestamp,
current-comm, task_pid_nr(current));
print_modules();
print_irqtrace_events(current);if (regs)show_regs(regs);elsedump_stack();
spin_unlock(&print_lock);
if (softlockup_panic)
panic(softlockup: hung tasks);}
可是softlockup_panic的值默認居然是0,因此在出現死鎖或者死循環的時候,會一直只輸出日誌信息,而不會宕機,這個真是好坑啊!因此你得手動修改/proc/sys/kernel/softlockup_panic的值,讓內核能夠在死鎖或者死循環的時候能夠宕機。若是你的機器中安裝了kdump,在重啓以後,你會獲得一分內核的core文件,這時從core文件中查找問題就方便不少了,並且不再用手動重啓機器了。若是你的內核是標準內核的話,能夠經過修改/proc/sys/kernel/softlockup_thresh來修改超時的閾值,若是是CentOS內核的話,對應的文件是/proc/sys/kernel/watchdog_thresh。CentOS內核和標準內核還有一個地方不同,就是處理CPU佔用時間過長的函數,CentOS下是watchdog_timer_fn()函數。
這裏介紹下lockup的概念。lockup分爲soft lockup和hard lockup。 soft lockup是指內核中有BUG致使在內核模式下一直循環的時間超過10s(根據實現和配置有所不一樣),而其餘進程得不到運行的機會。hard softlockup是指內核已經掛起,能夠經過watchdog這樣的機制來獲取詳細信息。
相關文章
相關標籤/搜索