熱補丁模塊由ksplice程序編譯生成,包含有缺陷的二進制指令和修復后的二進制指令(這些二進制按函數(shù)級別組織);模塊加載后,自動定位到內(nèi)核的缺陷處并以修復指令動態(tài)替換缺陷指令。

  除了免重啟修復,熱補丁還用于內(nèi)核開發(fā)過程的性能分析和故障定位。比如,加上性能統(tǒng)計代碼生成熱補丁,就可以在線分析感興趣的性能問題;加入額外調(diào)試代碼捕捉運行中內(nèi)核的異常。這些非常有用,更是海量服務器里捕捉不可重現(xiàn)內(nèi)核異常的不二法寶。由于熱補丁不需要重啟服務器,既可打入也可撤銷,所以不會有副作用。

  UCloud對開源Ksplice的優(yōu)化主要在以下三個方面:

  支持高版本內(nèi)核

  熱補丁技術與內(nèi)核緊密耦合。不同版本的內(nèi)核在指令結構體,符合表結構體和一些特性上(比如早期內(nèi)核沒有ftrace)有所不同,直接影響熱補丁成敗。UCloud研究了各版本內(nèi)核的區(qū)別,使得同一份ksplice支持各個版本的Linux內(nèi)核。值得一提的是,解決了ftrace與ksplice不兼容的問題。

  允許熱修復頻繁調(diào)用的函數(shù)

  不管什么樣的熱補丁技術,兩種類型的內(nèi)核函數(shù)難以熱補丁:頻繁使用的內(nèi)核函數(shù)如schedule, hrtimer;經(jīng)常處于線程棧內(nèi)核部分頂部的函數(shù),如sys_poll, sys_read。UCloud更改了ksplice相關內(nèi)核代碼和用戶態(tài)工具,成功解除了這些限制,比如UCloud現(xiàn)網(wǎng)服務器已打入了三個hrtimer熱補丁。

  減少業(yè)務中斷時間

  ksplice是在stop_machine后替換二進制指令的。雖然單次stop_machine對業(yè)務造成的中斷在一毫秒左右,但有些頻繁使用的內(nèi)核函數(shù)需要大量重試才能碰到合適的熱補丁時機,于是會造成最長達上百毫秒的中斷。UCloud在此做過一點優(yōu)化,使得業(yè)務中斷時間控制在十毫秒級別。

  海量服務器環(huán)境下熱補丁技術可用來零代價且無副作用地修復內(nèi)核缺陷,而且內(nèi)核開發(fā)也因熱補丁能走得更遠更好。以前因為缺乏輔助分析手段和懼怕內(nèi)核BUG,即使適合在內(nèi)核實現(xiàn)的特性也被告誡移到用戶態(tài)實現(xiàn),然而有了熱補丁,相關觀念也可以適當調(diào)整,內(nèi)核開發(fā)也可以更加大膽和跳脫。

分享到

aming

相關推薦