近期在服務器跑大量高負載程序,形成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這樣的機制來獲取詳細信息。