功能增強(qiáng)的soft lockup檢測(cè)機(jī)制使用說(shuō)明
soft lockup是指CPU被內(nèi)核代碼占用,導(dǎo)致無(wú)法執(zhí)行其他進(jìn)程,即CPU無(wú)法進(jìn)行調(diào)度的現(xiàn)象。內(nèi)核增強(qiáng)了soft lockup檢測(cè)功能,提供了更為詳盡的日志信息,能夠更迅速地定位問(wèn)題原因,從而采取相應(yīng)的措施進(jìn)行修復(fù)或優(yōu)化,提高系統(tǒng)的穩(wěn)定性和可靠性。
使用限制
內(nèi)核:ANCK 5.10-017及以上版本。
soft lockup檢測(cè)原理
內(nèi)核為每個(gè)CPU分配一個(gè)定時(shí)執(zhí)行的高優(yōu)先級(jí)watchdog內(nèi)核線程。如果該線程未能在設(shè)定期限內(nèi)獲得調(diào)度,則表明發(fā)生了soft lockup。
任務(wù)的優(yōu)先級(jí)從左至右依次降低:硬中斷、軟中斷、實(shí)時(shí)內(nèi)核線程、普通內(nèi)核線程、用戶進(jìn)程。
低優(yōu)先級(jí)的任務(wù)不能搶占高優(yōu)先級(jí)任務(wù)。
內(nèi)核對(duì)中斷處理的時(shí)序
一般情況下,內(nèi)核對(duì)中斷的處理時(shí)序圖如下所示。
功能增強(qiáng)的soft lockup場(chǎng)景說(shuō)明
soft lockup檢測(cè)的是硬中斷+軟中斷+內(nèi)核線程的總時(shí)間,主要關(guān)注以下三種場(chǎng)景。
場(chǎng)景 | 描述 | 分析說(shuō)明 |
CASE#1 | 軟中斷執(zhí)行時(shí)間過(guò)長(zhǎng)。 | 軟中斷的優(yōu)先級(jí)高于內(nèi)核線程,意味著在執(zhí)行軟中斷時(shí)不會(huì)調(diào)度watchdog線程。因此,若軟中斷的執(zhí)行時(shí)間過(guò)長(zhǎng),可能會(huì)導(dǎo)致soft lockup現(xiàn)象的發(fā)生。 |
CASE#2 | 硬中斷+軟中斷執(zhí)行時(shí)間過(guò)長(zhǎng)。 | 與案例#1類似。不同之處在于,可能存在大量中斷,內(nèi)核持續(xù)處理中斷,導(dǎo)致硬中斷+軟中斷的執(zhí)行時(shí)間較長(zhǎng),從而使得watchdog線程無(wú)法獲得調(diào)度,最終可能導(dǎo)致soft lockup的發(fā)生。 |
CASE#3 | 內(nèi)核線程執(zhí)行時(shí)間過(guò)長(zhǎng)。 | 最常見(jiàn)的soft lockup,也是內(nèi)核soft lockup檢測(cè)機(jī)制的檢測(cè)目標(biāo)。Alibaba Cloud Linux搭載的ANCK(Alibaba Cloud Kernel)內(nèi)核為不可搶占內(nèi)核,一旦進(jìn)入內(nèi)核態(tài),除非內(nèi)核任務(wù)執(zhí)行結(jié)束后返回用戶態(tài)或內(nèi)核任務(wù)主動(dòng)進(jìn)行調(diào)度,否則內(nèi)核將不會(huì)調(diào)度其他任務(wù)的執(zhí)行,這意味著watchdog線程也不會(huì)被調(diào)度。在內(nèi)核線程執(zhí)行耗時(shí)的計(jì)算、死循環(huán)、長(zhǎng)時(shí)間自旋等待鎖等情況下,通常可以從Call Tree中直接看出原因。 |
出現(xiàn)soft lockup的3種場(chǎng)景的時(shí)序圖如下所示。
功能增強(qiáng)的soft lockup使用說(shuō)明
執(zhí)行以下命令,查看內(nèi)核日志。
dmesg
功能增強(qiáng)的soft lockup檢測(cè)機(jī)制會(huì)在發(fā)生soft lockup后輸出以下信息。
watchdog: BUG: soft lockup - CPU#28 stuck for 23s! [fio:83921]
CPU#28 Utilization every 4s during lockup:
#1: 0% system, 0% softirq, 100% hardirq, 0% idle
#2: 0% system, 0% softirq, 100% hardirq, 0% idle
#3: 0% system, 0% softirq, 100% hardirq, 0% idle
#4: 0% system, 0% softirq, 100% hardirq, 0% idle
#5: 0% system, 0% softirq, 100% hardirq, 0% idle
根據(jù)輸出信息,判斷soft lockup的具體原因的規(guī)則如下:
如果硬中斷(hardirq)利用率較高,則表明是中斷風(fēng)暴。功能增強(qiáng)的soft lockup檢測(cè)機(jī)制當(dāng)檢測(cè)到硬中斷時(shí)間占比高于50%時(shí)會(huì)額外輸出最高頻的前5個(gè)中斷,如下所示。
[ 638.873494] CPU#9 Detect HardIRQ Time exceeds 50%. Most frequent HardIRQs: [ 638.873994] #1: 330945 irq#7 [ 638.874236] #2: 31 irq#82 [ 638.874493] #3: 10 irq#10 [ 638.874744] #4: 2 irq#89 [ 638.874992] #5: 1 irq#102
如果軟中斷(softirq)利用率很高,則表明是軟中斷處理時(shí)間過(guò)長(zhǎng)。
如果system利用率很高,則表明是內(nèi)核任務(wù)執(zhí)行時(shí)間過(guò)長(zhǎng)。
增強(qiáng)后的soft lockup檢測(cè)機(jī)制實(shí)戰(zhàn)指南
案例一:中斷風(fēng)暴導(dǎo)致的soft lockup。
以下5行信息順序輸出了soft lockup期間每個(gè)統(tǒng)計(jì)周期內(nèi)CPU的狀態(tài),從左往右分別是CPU處理內(nèi)核任務(wù)、處理軟中斷、處理硬中斷和空閑狀態(tài)的時(shí)間占比。可以看出導(dǎo)致soft lockup的原因是中斷風(fēng)暴(100% hardirq),同時(shí)也可以看出最高頻的中斷是
irq#129
,具體如下所示。通過(guò)
cat /proc/interrupts | awk '{print($1 $NF);}'
命令查看接口發(fā)現(xiàn),最高頻的irq#129是nvme2
中斷,具體如下所示。案例二:軟中斷處理時(shí)間過(guò)長(zhǎng)。
soft lockup期間CPU處理軟中斷的時(shí)間占比達(dá)到了100%(100% softirq),由此可以基本判斷,問(wèn)題是由
fq_flush_timeout
函數(shù)的執(zhí)行時(shí)間過(guò)長(zhǎng)導(dǎo)致的,接下來(lái)可以通過(guò)分析該函數(shù)的邏輯以進(jìn)一步排查問(wèn)題,具體如下所示。