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