自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux 4.1內(nèi)核熱補丁成功實踐

云計算
我們詳細介紹了進程cputime統(tǒng)計異常問題的完整分析和解決思路。該問題并非嚴重的宕機問題,但卻可能會讓用戶對監(jiān)控數(shù)據(jù)產(chǎn)生困惑,誤認為可能機器負載太高需要加資源,問題的解決會避免產(chǎn)生不必要的開支。

 最開始公司運維同學反饋,個別宿主機上存在進程CPU峰值使用率異常的現(xiàn)象。而數(shù)萬臺機器中只出現(xiàn)了幾例,也就是說萬分之幾的概率。監(jiān)控產(chǎn)生的些小誤差,不會造成宕機等嚴重后果,很容易就此被忽略了。

但我們考慮到這個異常轉(zhuǎn)瞬即逝、并不易被察覺,可能還存在更多這樣的機器,又或者現(xiàn)在正常將來又不正常,內(nèi)核研發(fā)本能的好奇心讓我們感到:此事必有蹊蹺!于是追查下去。

 

 

 

 

問題現(xiàn)象

 

 

 

 

現(xiàn)象一:CPU監(jiān)控非0即100%

該問題現(xiàn)象表現(xiàn)在Redis進程CPU監(jiān)控的峰值時而100% 時而為0,有的甚至是幾十分鐘都為0,突發(fā)1秒100%后又變?yōu)?,如下圖。

而從大量機器的統(tǒng)計規(guī)律看,這個現(xiàn)象在2.6.32 內(nèi)核不存在,在4.1內(nèi)核存在幾例。2.6.32是我們較早期采用的版本,為平臺的穩(wěn)定發(fā)展做了有力支撐,4.1 可以滿足很多新技術(shù)需求,如新款CPU、新板卡、RDMA、NVMe和binlog2.0等。后臺無縫維護著兩個版本,并為了能力提升和優(yōu)化而逐步向4.1及更高版本過渡。

現(xiàn)象二:top顯示非0即300%

登錄到機器上執(zhí)行top -b -d 1 –p <pid> | grep<pid> , 可以看到進程的CPU利用率每隔幾分鐘到幾十分鐘出現(xiàn)一次300%,這意味著該進程3個線程占用的3個CPU都跑滿了,跟監(jiān)控程序呈現(xiàn)同樣的異常。

 

 

 

 

 

問題分析

 

 

 

 

上述異常程序使用的是同樣的數(shù)據(jù)源:/proc/pid/stat中進程運行占用的用戶態(tài)時間utime和內(nèi)核態(tài)時間stime。我們抓取utime和stime更新情況后,發(fā)現(xiàn)utime或者stime每隔幾分鐘或者幾十分鐘才更新,更新的步進值達到幾百到1000+,而正常進程看到的是每幾秒更新,步進值是幾十。

定位到異常點后,還要找出原因。排除了監(jiān)控邏輯、IO負載、調(diào)用瓶頸等可能后,確認是4.1內(nèi)核的CPU時間統(tǒng)計有 bug。

cputime統(tǒng)計邏輯

檢查/proc/pid/stat中utime和stime被更新的代碼執(zhí)行路徑,在cputime_adjust()發(fā)現(xiàn)了一處可疑的地方:

當utime+stime>=rtime的時候就直接跳出了,也就是不更新utime和stime了!這里的rtime是runtime,代表進程運行占用的所有CPU時長,正常應該等于或近似進程用戶態(tài)時間+內(nèi)核態(tài)時間。 但內(nèi)核配置了CONFIG_VIRT_CPU_ACCOUNTING_GEN選項,這會讓utime和stime分別單調(diào)增長。而runtime是調(diào)度器里統(tǒng)計到的進程真正運行總時長。

內(nèi)核每次更新/proc/pid/stat的utime和stime的時候,都會跟rtime對比。如果utime+stime很長一段時間都大于rtime,那代碼直接goto out了, /proc/pid/stat就不更新了。只有當rtime持續(xù)更新追上utime+stime后,才更新utime和stime。

 

 

 

 

 

冷補丁和熱補丁

 

 

 

 

***回合:冷補丁

出現(xiàn)問題的代碼位置已經(jīng)找到,那就先去內(nèi)核社區(qū)看看有沒有成熟補丁可用,看一下kernel/sched/cputime.c的 changelog,看到一個patch:確保stime+utime=rtime。再看描述:像top這樣的工具,會出現(xiàn)超過100%的利用率,之后又一段時間為0,這不就是我們遇到的問題嗎?真是踏破鐵鞋無覓處,得來全不費工夫?。╬atch鏈接:https://lore.kernel.org/patchwork/patch/609410/

 

該補丁在4.3內(nèi)核及以后版本才提交, 卻并未提交到4.1穩(wěn)定版分支,于是移植到4.1內(nèi)核。打上該補丁后進行壓測,再沒出現(xiàn)cputime時而100%時而0%的現(xiàn)象,而是0-100%之間平滑波動的值。

至此,你可能覺得問題已經(jīng)解決了。但是,問題才解決了一半。而往往“但是”后邊才是重點。

第二回合:熱補丁

給內(nèi)核代碼打上該冷補丁只能解決新增服務器的問題,但公司還有數(shù)萬存量服務器是無法升級內(nèi)核后重啟的。

如果沒有其它好選擇,那存量更新將被迫采用如下的妥協(xié)方案:監(jiān)控程序修改統(tǒng)計方式進行規(guī)避,不再使用utime和stime,而是通過runtime來統(tǒng)計進程的執(zhí)行時間。

雖然該方案快速可行,但也有很大的缺點:

1.  很多業(yè)務部門都要修改統(tǒng)計程序,研發(fā)成本較高;

2.  /proc/pid/stat的utime和stime是標準統(tǒng)計方式,一些第三方組件并不容易修改;

3. 并沒有根本解決utime和stime不準的問題,用戶、研發(fā)、運維使用ps、top命令時還會產(chǎn)生困惑,產(chǎn)生額外的溝通協(xié)調(diào)成本。

幸好,我們還可以依靠UCloud已多次成功應用的技術(shù):熱補丁技術(shù)。

所謂熱補丁技術(shù),是指在有缺陷的服務器內(nèi)核或進程正在運行時,對已經(jīng)加載到內(nèi)存的程序二進制打上補丁,使得程序?qū)崟r在線狀態(tài)下執(zhí)行新的正確邏輯??梢院唵卫斫鉃橄耜P(guān)二爺那樣不打麻藥在清醒狀態(tài)下刮骨療傷。當然,對內(nèi)核刮骨療傷內(nèi)核是不會痛的,但刮不好內(nèi)核就會直接死給你看,沒有絲毫猶豫,非常干脆利索又耿直。

 

 

 

 

熱補丁修復

 

 

 

 

而本次熱補丁修復存在兩個難點:

難點一: 熱補丁制作

這次熱補丁在結(jié)構(gòu)體新增了spinlock成員變量,那就涉及新成員的內(nèi)存分配和釋放,在結(jié)構(gòu)體實例被復制和釋放時,都要額外的對新成員做處理,稍有遺漏可能會造成內(nèi)存泄漏進而導致宕機,這就加大了風險。

再一個就是,結(jié)構(gòu)體實例是在進程啟動時初始化的,對于已經(jīng)存在的實例如何塞進新的spinlock成員?所謂兵來將擋水來土掩,我們想到可以在原生補丁使用spinlock成員的代碼路徑上攔截,如果發(fā)現(xiàn)實例不含該成員,則進行分配、初始化、加鎖、釋放鎖。

要解決問題,既要攀登困難的山峰,又得控制潛在的風險。團隊編寫了腳本進行幾百萬次的加載、卸載熱補丁測試,并無內(nèi)存泄漏,單機穩(wěn)定運行,再下一城。

 

難點二:難以復現(xiàn)

另一個難題是該問題難以復現(xiàn),只有在現(xiàn)網(wǎng)生產(chǎn)環(huán)境才有幾個case可驗證熱補丁,而又不可以拿用戶的環(huán)境去冒險。針對這種情況我們已經(jīng)有標準化處理流程去應對,那就是設(shè)計完善的灰度策略,這也是UCloud內(nèi)部一直在強調(diào)的核心理念和能力。經(jīng)過分析,這個問題可以拆解為驗證熱補丁穩(wěn)定性和驗證熱補丁正確性。于是我們采取了如下灰度策略:

1. 穩(wěn)定性驗證:先拿幾臺機器測試正常,再拿公司內(nèi)部500臺次級重要的機器打熱補丁,灰度運行幾天正常,從而驗證了穩(wěn)定性,風險盡在掌控之中。

2. 正確性驗證:找到一臺出現(xiàn)問題的機器,同時打印utime+stime以及rtime,根據(jù)代碼的邏輯,當rtime小于utime+stime時會執(zhí)行老邏輯,當rtime大于utime+stime時會執(zhí)行新的熱補丁邏輯。如下圖所示,進入熱補丁的新邏輯后,utime+stime打印正常且與rtime保持了同步更新,從而驗證了熱補丁的正確性。

3. 全網(wǎng)變更:***再分批在現(xiàn)網(wǎng)環(huán)境機器上打熱補丁,執(zhí)行全網(wǎng)變更,問題得到根本解決,此處要感謝運維同學的全力協(xié)助。

 

 

 

 

總結(jié)

 

 

 

 

綜上,我們詳細介紹了進程cputime統(tǒng)計異常問題的完整分析和解決思路。該問題并非嚴重的宕機問題,但卻可能會讓用戶對監(jiān)控數(shù)據(jù)產(chǎn)生困惑,誤認為可能機器負載太高需要加資源,問題的解決會避免產(chǎn)生不必要的開支。此外,該問題也會讓研發(fā)、運維和技術(shù)支持的同學們使用top和ps命令時產(chǎn)生困惑。最終我們對問題的本質(zhì)仔細分析并求證,用熱補丁的方式妥善的解決了問題。

 

責任編輯:張燕妮 來源: UCloud技術(shù)公告牌
相關(guān)推薦

2019-01-15 09:10:17

邊緣計算數(shù)據(jù)中心IT

2018-09-18 09:30:17

微信熱補丁Android

2014-07-24 17:51:38

服務器UCloud內(nèi)核

2010-11-17 09:11:38

Linux內(nèi)核補丁

2010-06-25 19:07:38

SAP

2017-09-07 15:53:51

Go支付Java

2020-04-20 11:09:30

DevOps實踐因素

2021-08-19 08:04:36

IT部門首席信息官CIO

2010-01-18 17:32:03

2017-06-07 23:33:01

應用程序熱補丁代碼

2017-06-07 23:15:30

應用程序熱補丁代碼

2014-04-01 16:52:10

SUSEkGraftLinux內(nèi)核

2020-11-10 07:11:23

Linux內(nèi)核補丁

2009-07-02 18:16:05

Linux

2009-07-07 09:19:58

Linux

2011-09-30 13:54:10

H3C云網(wǎng)絡(luò)云安全

2015-05-13 14:12:52

Linux內(nèi)核內(nèi)核獲得成功

2018-12-17 16:39:20

Golang微服務

2022-10-25 12:11:13

點贊
收藏

51CTO技術(shù)棧公眾號