Linux 4.1內核熱補丁成功實踐

最開始公司運維同學反饋,個別宿主機上存在進程CPU峰值使用率異常的現象。而數萬臺機器中只出現了幾例,也就是說萬分之幾的概率。監控產生的些小誤差,不會造成宕機等嚴重后果,很容易就此被忽略了。但我們考慮到這個異常轉瞬即逝、并不易被察覺,可能還存在更多這樣的機器,又或者現在正常將來又不正常,內核研發本能的好奇心讓我們感到:此事必有蹊蹺!于是追查下去。

問題現象

現象一:CPU監控非0即100%

該問題現象表現在Redis進程CPU監控的峰值時而100% 時而為0,有的甚至是幾十分鐘都為0,突發1秒100%后又變為0,如下圖。

\"\"

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

現象二:top顯示非0即300%

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

\"\"

問題分析

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

定位到異常點后,還要找出原因。排除了監控邏輯、IO負載、調用瓶頸等可能后,確認是4.1內核的CPU時間統計有 bug。

cputime統計邏輯

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

\"\"

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

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

\"\"

冷補丁和熱補丁

第一回合:冷補丁

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

\"\"

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

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

第二回合:熱補丁

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

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

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

  1. 很多業務部門都要修改統計程序,研發成本較高;
  2. /proc/pid/stat的utime和stime是標準統計方式,一些第三方組件并不容易修改;
  3. 并沒有根本解決utime和stime不準的問題,用戶、研發、運維使用ps、top命令時還會產生困惑,產生額外的溝通協調成本。

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

所謂熱補丁技術,是指在有缺陷的服務器內核或進程正在運行時,對已經加載到內存的程序二進制打上補丁,使得程序實時在線狀態下執行新的正確邏輯。可以簡單理解為像關二爺那樣不打麻藥在清醒狀態下刮骨療傷。當然,對內核刮骨療傷內核是不會痛的,但刮不好內核就會直接死給你看,沒有絲毫猶豫,非常干脆利索又耿直。

熱補丁修復

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

難點一:?熱補丁制作

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

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

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

\"\"

難點二:難以復現

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

  • 穩定性驗證:先拿幾臺機器測試正常,再拿公司內部500臺次級重要的機器打熱補丁,灰度運行幾天正常,從而驗證了穩定性,風險盡在掌控之中。
  • 正確性驗證:找到一臺出現問題的機器,同時打印utime+stime以及rtime,根據代碼的邏輯,當rtime小于utime+stime時會執行老邏輯,當rtime大于utime+stime時會執行新的熱補丁邏輯。如下圖所示,進入熱補丁的新邏輯后,utime+stime打印正常且與rtime保持了同步更新,從而驗證了熱補丁的正確性。

\"\"

  • 全網變更: 最后再分批在現網環境機器上打熱補丁,執行全網變更,問題得到根本解決,此處要感謝運維同學的全力協助。

總結

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

文章首發于公眾號\u0026quot;UCloud技術\u0026quot;: https://mp.weixin.qq.com/s/nIOvQuLtdQwLPi8AqJiBPg

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388128.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388128.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388128.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python分句_Python循環中的分句,繼續和其他子句

python分句Python中的循環 (Loops in Python) for loop for循環 while loop while循環 Let’s learn how to use control statements like break, continue, and else clauses in the for loop and the while loop.讓我們學習如何在for循環和while循環中使用諸如break &#xf…

eclipse plugin 菜單

簡介: 菜單是各種軟件及開發平臺會提供的必備功能,Eclipse 也不例外,提供了豐富的菜單,包括主菜單(Main Menu),視圖 / 編輯器菜單(ViewPart/Editor Menu)和上下文菜單&am…

[翻譯 EF Core in Action 2.0] 查詢數據庫

Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的關于Entityframework Core 書籍。原版地址. 是除了官方文檔外另一個學習EF Core的不錯途徑, 書中由淺入深的講解的EF Core的相關知識。因為沒有中文版,所以本人對其進行翻譯。 預計每兩天…

hdu5692 Snacks dfs序+線段樹

題目傳送門 題目大意:給出一顆樹,根節點是0,有兩種操作,一是修改某個節點的value,二是查詢,從根節點出發,經過 x 節點的路徑的最大值。 思路:用樹狀數組寫發現還是有些麻煩&#xff…

python數據建模數據集_Python中的數據集

python數據建模數據集There are useful Python packages that allow loading publicly available datasets with just a few lines of code. In this post, we will look at 5 packages that give instant access to a range of datasets. For each package, we will look at h…

打開editor的接口討論

【打開editor的接口討論】 先來看一下workbench吧,workbench從靜態劃分應該大致如下: 從結構圖我們大致就可以猜測出來,workbench page作為一個IWorkbenchPart(無論是eidtor part還是view part&#…

【三角函數】已知直角三角形的斜邊長度和一個銳角角度,求另外兩條直角邊的長度...

如圖,已知直角三角形ABC中,∠C90, ∠Aa ,ABc ,求直角邊AC、BC的長度. ∵ ∠C90,∠Aa ,ABc ,Cos∠AAC/AB ,Sin∠ABC/AB ,∴ ACAB*Cos∠Ac*Cosa ,BCAB*Sin∠Ac*Sina . 復制代碼

網絡攻防技術實驗五

2018-10-23 實驗五 學 號201521450005 中國人民公安大學 Chinese people’ public security university 網絡對抗技術 實驗報告 實驗五 綜合滲透 學生姓名 陳軍 年級 2015 區隊 五 指導教師 高見 信息技術與網絡安全學院 2018年10月23日 實驗任務總綱 2018—2019 …

usgs地震記錄如何下載_用大葉草繪制USGS地震數據

usgs地震記錄如何下載One of the many services provided by the US Geological Survey (USGS) is the monitoring and tracking of seismological events worldwide. I recently stumbled upon their earthquake datasets provided at the website below.美國地質調查局(USGS)…

Springboot 項目中 xml文件讀取yml 配置文件

2019獨角獸企業重金招聘Python工程師標準>>> 在xml文件中讀取yml文件即可&#xff0c;代碼如下&#xff1a; 現在spring-boot提倡零配置&#xff0c;但是的如果要集成老的spring的項目&#xff0c;涉及到的bean的配置。 <bean id"yamlProperties" clas…

eclipse 插件打包發布

如果想把調試好的插件打包發布&#xff0c;并且在ECLIPSE中可以使用. 1.File-->Export 2.選擇 PLug-in Development下 的 Deployable plug-ins and fragments 3.進入 Deployable plug-ins and fragments 頁面 4.把底下的 Destubatuib 的選項中選擇 Archive file 在這里添入要…

無法獲取 vmci 驅動程序版本: 句柄無效

https://jingyan.baidu.com/article/a3a3f811ea5d2a8da2eb8aa1.html 將 vmci0.present "TURE" 改為 “FALSE”; 轉載于:https://www.cnblogs.com/limanjihe/p/9868462.html

數據可視化 信息可視化_更好的數據可視化的8個技巧

數據可視化 信息可視化Ggplot is R’s premier data visualization package. Its popularity can likely be attributed to its ease of use — with just a few lines of code you are able to produce great visualizations. This is especially great for beginners who are…

分布式定時任務框架Elastic-Job的使用

為什么80%的碼農都做不了架構師&#xff1f;>>> 一、前言 Elastic-Job是一個優秀的分布式作業調度框架。 Elastic-Job是一個分布式調度解決方案&#xff0c;由兩個相互獨立的子項目Elastic-Job-Lite和Elastic-Job-Cloud組成。 Elastic-Job-Lite定位為輕量級無中心化…

Memcached和Redis

Memcached和Redis作為兩種Inmemory的key-value數據庫&#xff0c;在設計和思想方面有著很多共通的地方&#xff0c;功能和應用方面在很多場合下(作為分布式緩存服務器使用等) 也很相似&#xff0c;在這里把兩者放在一起做一下對比的介紹 基本架構和思想 首先簡單介紹一下兩者的…

第4章 springboot熱部署 4-1 SpringBoot 使用devtools進行熱部署

/imooc-springboot-starter/src/main/resources/application.properties #關閉緩存, 即時刷新 #spring.freemarker.cachefalse spring.thymeleaf.cachetrue#熱部署生效 spring.devtools.restart.enabledtrue #設置重啟的目錄,添加那個目錄的文件需要restart spring.devtools.r…

border-radius 漲知識的寫法

<div idapp></div>復制代碼#app{width:100%;height:80px;background:pink;border-radius:75%/20% 20% 0 0;}復制代碼僅供自己總結記憶轉載于:https://juejin.im/post/5c80afd66fb9a049f81a1217

ibm python db_使用IBM HR Analytics數據集中的示例的Python獨立性卡方檢驗

ibm python dbSuppose you are exploring a dataset and you want to examine if two categorical variables are dependent on each other.假設您正在探索一個數據集&#xff0c;并且想要檢查兩個分類變量是否相互依賴。 The motivation could be a better understanding of …

Oracle優化檢查表

分類檢查項目相關文件或結果狀態備注日志及文件Oracle Alert 日志bdump/udump下是否存在明顯的報警listener相關日志SQL* Net日志參數/參數文件listener.ora/tnsnames.ora操作系統操作系統版本檢查操作系統補丁節點名操作系統vmstat狀態操作系統I/O狀態操作系統進程情況操作系統…

spring分布式事務學習筆記(2)

此文已由作者夏昀授權網易云社區發布。歡迎訪問網易云社區&#xff0c;了解更多網易技術產品運營經驗。Model類如下&#xff1a;package com.xy.model1 package com.xy.model;2 3 /**4 * Created by helloworld on 2015/1/30.5 */6 public class NameQa {7 private long …