linux死鎖檢測與除錯

2021-08-08 13:24:43 字數 2911 閱讀 1455

死鎖是指多個程序(執行緒)因為長久等待已被其他程序占有的的資源而陷入阻塞的一種狀態。當等待的資源一直得不到釋放,死鎖會一直持續下去。死鎖一旦發生,程式本身是解決不了的,只能依靠外部力量使得程式恢復執行,例如重啟,開門狗復位等。

linux 提供了檢測死鎖的機制,主要分為 d 狀態死鎖和 r 狀態死鎖。

soft lockup:搶占被長時間關閉而導致程序無法排程.

hard lockup: 中斷被長時間關閉而導致更嚴重的問題.

後面會分析這種lockup的核心檢測原理.

linux核心於2023年引入核心lockdep 死鎖檢測模組(

本節主要分析linux核心soft lockup 和 hard lockup檢測原理.

首先,系統會為每個cpu core註冊乙個一般的kernel執行緒,名字叫watchdog/0, watchdog/1…以此類推。

這個執行緒會定期得呼叫watchdog函式

static struct smp_hotplug_thread watchdog_threads = ;  

void __init lockup_detector_init(void)

}

我們先不理會這個執行緒處理函式watchdog多久被呼叫一次,我們就先簡單的認為,這個執行緒是負責更新watchdog_touch_ts的。

static void __touch_watchdog(void)  

static void watchdog(unsigned int cpu)

時鐘中斷處理函式是watchdog_timer_fn

static

void watchdog_enable(unsigned

int cpu)

static

enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)

else

__this_cpu_write(soft_watchdog_warn, false);

return hrtimer_restart;

}

這個函式主要做2件事情:

1) . 更新hrtimer_interrupts變數。

static

void watchdog_interrupt_count(void)

這裡我們就要回顧之前建立的那個kernel執行緒了,多久呼叫一次就和hrtimer_interrupts的值密切相關。

static

int watchdog_should_run(unsigned

int cpu)

只有在hrtimer_interrupts發生了更新的情況下,kernel執行緒才會被得到執行。

那就是說,kernel執行緒和時鐘中斷函式的頻率是相同的。預設情況是10*2/5=4秒一次。

static int get_softlockup_thresh(void)

static void set_sample_period(void)

2) 就是要探測是否有soft lockup發生。

static

int is_softlockup(unsigned

long touch_ts)

很容易理解,其實就是檢視watchdog_touch_ts變數在最近20秒的時間內,有沒有被建立的kernel thread更新過。

假如沒有,那就意味著執行緒得不到排程,所以很有可能就是在某個cpu core上搶占被關閉了,所以排程器沒有辦法進行排程。

這種情況下,系統往往不會死掉,但是會很慢。

有了soft lockup的機制,我們就能盡早的發現這樣的問題了。

perf_event_create_kernel_counter函式主要是註冊了乙個硬體的事件。

static

int watchdog_nmi_enable(unsigned

int cpu)

這個硬體有乙個功能就是在cpu clock經過了多少個週期後發出乙個nmi中斷(不可遮蔽中斷)出來。

而這個中斷的出路函式就是watchdog_overflow_callback。

static

void watchdog_overflow_callback(struct perf_event *event,

struct perf_sample_data *data,

struct pt_regs *regs)

return;

}

這個函式主要就是呼叫is_hardlockup

static

int is_hardlockup(void)

而這個函式主要就是檢視hrtimer_interrupts變數在時鐘中斷處理函式裡有沒有被更新。

假如沒有更新,就意味著中斷出了問題,可能被錯誤**長時間的關中斷了。

那這樣,相應的問題也就暴露出來了。

aa: 重複上鎖

abba: 曾經使用 ab 順序上鎖,又使用 ba 上鎖

abbcca: 這種型別是 abba 的擴充套件。ab 順序 , ab 順序,ca 順序。這種鎖人工很難發現。

多次 unlock

1) 單鎖狀態規則

2) 多鎖依賴規則

cpu0:    [ l1 ] -> [ l1 ]
<1>.

<2>.

Linux核心死鎖檢測

其核心思想為建立乙個核心監測程序迴圈監測處於d狀態的每乙個程序 任務 核心配置 config detect hung task kernel hacking detect hung tasks 120 default timeout for hung task detection in second...

死鎖檢測演算法

一 實驗目的 3 二 實驗內容 3 1 資料輸入 3 2 處理要求 3 三 實現思路 4 死鎖檢測機制 4 四 主要的資料結構 4 標頭檔案與巨集定義 4 程序結構體定義 4 初始化函式 4 讀入資料檔案 4 輸出所讀入的資料 4 檢測 5 顯示資訊函式 5 主函式 5 五 演算法流程圖 5 六 執...

mysql死鎖檢測演算法 一種簡單的死鎖檢測演算法

1.死鎖檢測 給定一組執行緒操作鎖的流程,判斷是否會發生死鎖?例如 有兩個執行緒和兩個資源,執行緒對鎖的操作如下 其中t表示執行緒id,l表示鎖id,s表示操作 1表示獲取鎖,0表示釋放鎖 t l s 1 1 1 執行緒1獲取1號鎖 2 2 2 執行緒2獲取2號鎖 1 2 1 執行緒1獲取2號鎖,保...