日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

零代价修复海量服务器的内核缺陷——UCloud内核热补丁技术揭秘

發布時間:2023/11/27 生活经验 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 零代价修复海量服务器的内核缺陷——UCloud内核热补丁技术揭秘 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

下述為UCloud資深工程師邱模炯在InfoQ架構師峰會上的演講——《UCloud云平臺的內核實踐》中非常受關注的內核熱補丁技術的一部分。給大家揭開了UCloud云平臺內核技術的神秘面紗。

?

如何零代價修復海量服務器的Linux內核缺陷?

?

對于一個擁有成千上萬臺服務器的公司,Linux內核缺陷導致的死機屢見不鮮。讓工程師們糾結的是,到底要不要通過給服務器升級內核來修復缺陷?升級意味者服務器重啟、業務中斷以及繁重的準備工作;不升級則擔心服務器死機,同樣造成業務中斷和繁重的善后工作。

?

而在今天的云計算時代,一臺宿主機往往運行多個云主機,每一次重啟不管是主動升級還是被動死機,都意味著中斷其上運行的所有云主機。因此,宿主機內核缺陷的修復更加棘手。

?

而作為一個支撐著上萬家企業用戶IT基礎架構的云服務商,UCloud云平臺上的海量宿主機又是如何修復內核缺陷的呢?

?

邱模炯透露,如果按照傳統的重啟方式來修復,那么無論是對于UCloud或是用戶,都意味著繁重的運維和業務中斷。但是,UCloud通過“內核熱補丁技術”——即給運行中的內核打上二進制補丁,UCloud已經做到了零代價免重啟修復海量服務器的內核缺陷!目前為止,UCloud對所發現的上游內核10+個缺陷全以熱補丁方式修復,累計數萬臺次,無一例失敗且無任何副作用;理論上避免了相應次數的宿主機重啟及所隱含的云主機業務中斷。這項技術在UCloud已經成熟。

?

UCloud內核熱補丁技術揭秘

?

UCloud的熱補丁技術基于多年前的開源ksplice加以定制優化而來,通過加載一個特殊準備的熱補丁模塊來修復內核。其過程如下圖所示:

?

?

?

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

?

ksplice熱補丁模塊的創建原理見下圖:

?

首先獲取一份運行中內核對應的源碼并編譯出二進制,稱為pre對象;打上源碼補丁再次編譯,稱為post對象。而運行中的內核二進制稱為run對象。post和pre逐條指令比較并找出存在差異的函數,之后把這些差異合并為內核模塊形式的熱補丁。

?

創建好的熱補丁模塊在加載到內核時還會做些檢驗工作:對比pre和run對象。只有通過檢驗才能成功加載進內核。pre-run比較的目的是為了辨別編譯過程差異是否過大以致于不能打入post對象的熱補丁;更重要的是,從pre-run差異中提取的關鍵信息才能把post對象的熱補丁順利打入運行中內核。

?

熱補丁模塊加載到內核后,便自動進行內核修復。也就是使用熱補丁中的二進制指令替換有缺陷的二進制指令。這里ksplice利用了Linux內核的stop_machine機制:停止所有CPU的執行,只留下主CPU進行二進制指令替換。值得注意的是,stop_machine后如果發現任何一個線程棧的內容與熱補丁存在沖突,就需要退出指令替換以避免系統崩潰。所以并非所有熱補丁都能打入內核,有些頻繁使用的內核函數(如schedule, hrtimer相關)就無法熱補丁,重試次數再多也無濟于事。

?

ksplice同時支持對內核和模塊進行熱補丁,也支持熱補丁后疊加熱補丁,靈活方便。不過也存在一些缺陷:stop_machine期間整個系統處于中斷狀態,雖然單次中斷小于1ms,但有些時候多次重試的累計中斷也不小;另外,有些頻繁使用的函數無法打入熱補丁。

?

kpatch和kgraft

kpatch和kgraft均是近期新出現的內核熱補丁技術,前者屬于Redhat公司,后者SuSE。兩者原理和ksplice大致相同,都想合并進Linux內核,內核社區正在爭議對比。

?

kpatch原理和前面講的ksplice很接近。最大的區別在于二進制指令替換,stop_machine停止所有CPU執行后ksplice直接修改,而kpatch則借助ftrace機制來觸發替換。目前的實現上,kpatch有較大局限性,不支持對模塊打熱補丁,不支持函數靜態變量等。

?

kgraft原理也基本一樣。主要的差異有兩點:

?

1)熱補丁生成方法不同;

2)熱補丁打入內核過程里kgraft用到了RCU漸進方法。得益于RCU方法,kgraft無需像ksplice和kpatch一樣調用stop_machine并檢查線程棧的沖突。不過它的缺點也緣于RCU,涉及到數據結構改變時,kgraft更難通過編寫輔助代碼打入熱補丁,這限制了kgraft的應用范圍。

?

有關kpatch和kgraft的詳細情況請分別參考Redhat和SuSE網站的技術資料。

?

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

?

UCloud對開源Ksplice的優化主要在以下三個方面:

?

支持高版本內核

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

?

允許熱修復頻繁調用的函數

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

?

減少業務中斷時間

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

?

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

轉載于:https://www.cnblogs.com/UCloud/p/3868467.html

總結

以上是生活随笔為你收集整理的零代价修复海量服务器的内核缺陷——UCloud内核热补丁技术揭秘的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。