linux 内核 死锁 检查,一种linux内核自旋锁死锁检测报告系统和方法与流程
本發明涉及內核死鎖檢測領域,具體的說是一種linux內核自旋鎖死鎖檢測報告系統和方法。
背景技術:
linux內核死鎖是長期困擾內核開發人員的問題之一,但自內核引入lockdep調試模塊之后,內核死鎖得到了快速定位和解決。linux開發人員為了實現一定功能,會開發自己的內核模塊加載到內核以實現一定的內核功能,這種方式可能會引入內核死鎖。由于lockdep是內核調試模塊,主要用于內核開發中死鎖檢查,現有lockdep是內核debug模塊,開啟此功能需要重新編譯內核。常規內核不會開啟此選項,因此正常系統不包含此功能,因此正常系統下定位死鎖更為困難。
技術實現要素:
本發明針對目前技術發展的需求和不足之處,提供一種linux內核自旋鎖死鎖檢測報告系統和方法。
本發明所述一種linux內核自旋鎖死鎖檢測報告系統和方法,解決上述技術問題采用的技術方案如下:所述linux內核自旋鎖死鎖檢測報告系統,其系統架構主要包括內核態以及內核Kpatch模塊、用戶態以及日志報告模塊、通信模塊;其中,內核態中生成內核Kpatch模塊,用戶態中生成日志報告模塊,并且內核Kpatch模塊通過通信模塊與日志報告模塊通信交互;
內核態中通過內核Kpatch模塊獲取內核自旋鎖死鎖信息,通信模塊將內核自旋鎖死鎖信息封裝傳輸到用戶態的日志報告模塊,通過日志報告模塊解析封裝的內核自旋鎖死鎖信息,生成自旋鎖死鎖日志報告。
優選的,所述內核Kpatch模塊:是通過修改對應版本內核源碼,實現獲取內核自旋鎖死鎖信息功能,再通過kpatch-build命令生產內核Kpatch模塊。
優選的,所述通信模塊:是通過netlink網絡連接,實現內核態和用戶態通信,將獲取的內核自旋鎖死鎖信息封裝后傳輸到用戶態。
優選的,所述日志報告模塊:對發送過來的內核自旋鎖死鎖信息進行解析,生成自旋鎖死鎖日志報告。
一種linux內核自旋鎖死鎖檢測報告方法,通過修改對應版本內核源碼,實現獲取內核自旋鎖死鎖信息功能,并通過kpatch-build命令生成內核kpatch模塊加載到內核中;然后,通過內核kpatch模塊獲取內核自旋鎖死鎖信息;通過通信模塊網絡鏈接實現內核kpatch模塊與用戶態中日志報告模塊通信,將獲取的內核自旋鎖死鎖信息傳輸到用戶態;最后,用戶態的日志報告模塊對內核發送來的自旋鎖死鎖信息進行解析,生成自旋鎖死鎖日志報告。
優選的,生成內核kpatch模塊的主要過程如下:
安裝配置系統版本對應kpatch打包環境,修改內核源碼實現獲取自旋鎖死鎖信息功能;然后對比修改前后內核源碼生成kpatch文件,通過kpatch-build命令生成獲取死鎖功能的內核kpatch模塊。
本發明所述一種linux內核自旋鎖死鎖檢測報告系統和方法,與現有技術相比具有的有益效果是:本方法在不編譯內核的情況下,實現內核自旋鎖死鎖檢測并報告;克服了啟動lockdep內核調試模塊死鎖檢查需要重新編譯內核的缺陷,使得故障管理軟件具有自旋鎖死鎖檢查報告功能,增強服務器產品競爭力。
附圖說明
附圖1為linux內核自旋鎖死鎖檢測報告系統的示意圖;
附圖2為linux內核自旋鎖死鎖檢測報告方法的流程圖。
具體實施方式
為使本發明的目的、技術方案和優點更加清楚明白,以下結合具體實施例,對本發明所述一種linux內核自旋鎖死鎖檢測報告系統和方法進一步詳細說明。
本發明提出了一種linux內核自旋鎖死鎖檢測報告系統和方法,在不編譯內核情況下,通過修改相應的內核源碼,實現獲取內核自旋鎖死鎖功能,再利用熱補丁kpatch技術,在內核watchdog生成內核檢測kpatch模塊,動態加載到系統中;通過kpatch模塊獲取內核自旋鎖死鎖信息;最后將內核自旋鎖死鎖信息封裝發送到用戶態,用戶態解析死鎖數據并報告。
linux內核提供watchdog softlockup(搶占被長時間關閉而導致進程無法調度)機制,為每個CPU啟動一個內核線程,該線程為優先級最高的實時線程,該線程得到調度時,會根據相應的計數(時間戳),同時啟動定時器,當定時器到期時檢查相應的時間戳,如果超時,沒有更新,則說明這段時間內都沒有發生調度,產生softlockup事件。內核自旋鎖死鎖滿足softlockup產生條件,因此可以通過獲取內核softlockup報告信息獲取內核自旋鎖死鎖。
內核熱補丁kpatch技術,是在不重新編譯內核的情況下,修改內核代碼,生成kpatch模塊,動態加載到內核中,實現對運行中內核打補丁。
實施例:
本實施例所述linux內核自旋鎖死鎖檢測報告系統,如附圖1所示,其系統架構主要包括內核態以及內核Kpatch模塊、用戶態以及日志報告模塊、通信模塊;其中,內核態中生成內核Kpatch模塊,用戶態中生成日志報告模塊,并且內核Kpatch模塊通過通信模塊與日志報告模塊通信交互;
內核態中通過內核Kpatch模塊獲取內核自旋鎖死鎖信息,通信模塊將內核自旋鎖死鎖信息封裝傳輸到用戶態的日志報告模塊,通過日志報告模塊解析封裝的內核自旋鎖死鎖信息,生成自旋鎖死鎖日志報告。
所述內核Kpatch模塊:是通過修改對應版本內核源碼,實現獲取內核自旋鎖死鎖信息功能,再通過kpatch-build命令生產內核Kpatch模塊。
所述通信模塊:是通過netlink網絡連接,實現內核態和用戶態通信,將獲取的內核自旋鎖死鎖信息封裝后傳輸到用戶態。
所述日志報告模塊:對發送過來的內核自旋鎖死鎖信息進行解析,生成自旋鎖死鎖日志報告。
所述linux內核自旋鎖死鎖檢測報告方法,通過修改對應版本內核源碼,實現獲取內核自旋鎖死鎖信息功能,并通過kpatch-build命令生成內核kpatch模塊加載到內核中;然后,通過內核kpatch模塊獲取內核自旋鎖死鎖信息;通過通信模塊網絡鏈接實現內核kpatch模塊與用戶態中日志報告模塊通信,將獲取的內核自旋鎖死鎖信息傳輸到用戶態;最后,用戶態的日志報告模塊對內核發送來的自旋鎖死鎖信息進行解析,生成自旋鎖死鎖日志報告。
生成內核kpatch模塊的主要過程如下:
安裝配置系統版本對應kpatch打包環境,修改內核源碼實現獲取自旋鎖死鎖信息功能;然后對比修改前后內核源碼生成kpatch文件,通過kpatch-build命令生成獲取死鎖功能的內核kpatch模塊。這一過程中,修改內核源碼實現獲取死鎖功能。
修改內核源碼的實現過程主要如下:
定義內核死鎖數據結構,主要包括:內核鏈表struct list_head,提供將死鎖信息加入鏈表功能;unsigned int device,表示故障設備id,即死鎖發生CPU編號;enum lock_type type,表示死鎖類型,判斷是否為自旋鎖類;unsigned int task,死鎖進程號,表示是哪個進程導致死鎖;unsigned int duration,表示已經發生死鎖持續時間。
并在softlockup代碼實現位置添加獲取device、type、task、duration數據;在內核watchdog.c文件的watchdog_timer_fn()函數中,device通過smp_processor_id()函數獲取;task通過task_pid_nr(current)函數獲取;type通過sprint_symbol(buffer,regs->ip)獲取,通過對buffer中字段進行匹配,判斷是否是自旋鎖(spinlock);duration獲取當前處理器duration參數。
采用上述linux內核自旋鎖死鎖檢測報告方法,進行內核自旋鎖死鎖檢查的具體流程如附圖2所示:
第一,加載內核自旋鎖死鎖檢測kpatch模塊,kpatch模塊修改的內核源碼開始生效;
第二,判斷內核中是否有滿足softlockup事件發生,滿足條件kpatch模塊獲取內核自旋鎖死鎖信息;
第三,判斷是否是內核自旋鎖死鎖信息,滿足條件,則將內核自旋鎖死鎖信息封裝數據通過通信模塊傳輸到用戶態;
第四,用戶態對內核自旋鎖死鎖數據進行解析,然后報告到日志中。
具體實施方式僅是本發明的具體個案,本發明的專利保護范圍包括但不限于上述具體實施方式,任何符合本發明的權利要求書的且任何所屬技術領域的普通技術人員對其所做的適當變化或替換,皆應落入本發明的專利保護范圍。
總結
以上是生活随笔為你收集整理的linux 内核 死锁 检查,一种linux内核自旋锁死锁检测报告系统和方法与流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苏宁2.1亿美元投资云锋基金最新消息 已
- 下一篇: linux游戏脚本,ubuntu 新手一