熱補(bǔ)丁模塊由ksplice程序編譯生成,包含有缺陷的二進(jìn)制指令和修復(fù)后的二進(jìn)制指令(這些二進(jìn)制按函數(shù)級(jí)別組織);模塊加載后,自動(dòng)定位到內(nèi)核的缺陷處并以修復(fù)指令動(dòng)態(tài)替換缺陷指令。
除了免重啟修復(fù),熱補(bǔ)丁還用于內(nèi)核開發(fā)過(guò)程的性能分析和故障定位。比如,加上性能統(tǒng)計(jì)代碼生成熱補(bǔ)丁,就可以在線分析感興趣的性能問(wèn)題;加入額外調(diào)試代碼捕捉運(yùn)行中內(nèi)核的異常。這些非常有用,更是海量服務(wù)器里捕捉不可重現(xiàn)內(nèi)核異常的不二法寶。由于熱補(bǔ)丁不需要重啟服務(wù)器,既可打入也可撤銷,所以不會(huì)有副作用。
UCloud對(duì)開源Ksplice的優(yōu)化主要在以下三個(gè)方面:
支持高版本內(nèi)核
熱補(bǔ)丁技術(shù)與內(nèi)核緊密耦合。不同版本的內(nèi)核在指令結(jié)構(gòu)體,符合表結(jié)構(gòu)體和一些特性上(比如早期內(nèi)核沒有ftrace)有所不同,直接影響熱補(bǔ)丁成敗。UCloud研究了各版本內(nèi)核的區(qū)別,使得同一份ksplice支持各個(gè)版本的Linux內(nèi)核。值得一提的是,解決了ftrace與ksplice不兼容的問(wèn)題。
允許熱修復(fù)頻繁調(diào)用的函數(shù)
不管什么樣的熱補(bǔ)丁技術(shù),兩種類型的內(nèi)核函數(shù)難以熱補(bǔ)?。侯l繁使用的內(nèi)核函數(shù)如schedule, hrtimer;經(jīng)常處于線程棧內(nèi)核部分頂部的函數(shù),如sys_poll, sys_read。UCloud更改了ksplice相關(guān)內(nèi)核代碼和用戶態(tài)工具,成功解除了這些限制,比如UCloud現(xiàn)網(wǎng)服務(wù)器已打入了三個(gè)hrtimer熱補(bǔ)丁。
減少業(yè)務(wù)中斷時(shí)間
ksplice是在stop_machine后替換二進(jìn)制指令的。雖然單次stop_machine對(duì)業(yè)務(wù)造成的中斷在一毫秒左右,但有些頻繁使用的內(nèi)核函數(shù)需要大量重試才能碰到合適的熱補(bǔ)丁時(shí)機(jī),于是會(huì)造成最長(zhǎng)達(dá)上百毫秒的中斷。UCloud在此做過(guò)一點(diǎn)優(yōu)化,使得業(yè)務(wù)中斷時(shí)間控制在十毫秒級(jí)別。
海量服務(wù)器環(huán)境下熱補(bǔ)丁技術(shù)可用來(lái)零代價(jià)且無(wú)副作用地修復(fù)內(nèi)核缺陷,而且內(nèi)核開發(fā)也因熱補(bǔ)丁能走得更遠(yuǎn)更好。以前因?yàn)槿狈o助分析手段和懼怕內(nèi)核BUG,即使適合在內(nèi)核實(shí)現(xiàn)的特性也被告誡移到用戶態(tài)實(shí)現(xiàn),然而有了熱補(bǔ)丁,相關(guān)觀念也可以適當(dāng)調(diào)整,內(nèi)核開發(fā)也可以更加大膽和跳脫。