当前位置: 首页 > 编程日记 > 正文

零代价修复海量服务器的内核缺陷——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

相关文章:

软件工程技术基础-(软件复用技术)

软件可重用问题,包括源程序代码重用、静态库重用和组建重用。 源程序代码重用是直接将其他项目或系统开发完成的代码复制过来,直接使用。 限制源程序代码重用技术使用的关键因素是要考虑代码的语言实现,以及源代码 公开可能带来的知识产权问题…

Parcelable与Serializable的比较

Parcel: Android中的序列化方式,可用于跨进程传输 Parcelable 进程间 如:想从一个第三方app拿进程回来 Serializable 进程内

20140725 快速排序时间复杂度 sTL入门

1、快速排序的时间复杂度(平均时间复杂度为) 数组本身就有序时&#xff0c;效果很差为O(n^2) 2、STl入门 &#xff08;1&#xff09; C内联函数(inline)和C中宏(#define)区别 内联函数有类型检查&#xff0c;宏定义没有&#xff1b;C编程尽量使用内联函数 template <class T…

小编带你进入强如 Disruptor 也发生内存溢出?

前言OutOfMemoryError 问题相信很多朋友都遇到过&#xff0c;相对于常见的业务异常&#xff08;数组越界、空指针等&#xff09;来说这类问题是很难定位和解决的。 本文以最近碰到的一次线上内存溢出的定位、解决问题的方式展开&#xff1b;希望能对碰到类似问题的同学带来思路…

数据库反规范设计

< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> 反规范化设计 为了提升性能而使用反规范化设计 常用方法&#xff1a; A、在多个表中存储某个字段的副本 B、在父表中存储汇总值 C、将活动数据和历史数据分开存储 D、应用程序本地缓…

安卓的两种界面编写方式对比

1.XML进行描述 优点是可以直接在Android studio Preview 栏中查看效果(所见即所得&#xff0c;但是不是所有的都可以立刻看到效果) 注意&#xff1a;包含两种方式-编辑layout文件夹下的XML文件 和 直接从下图的图形化界面操作 2.Java/Kotlin代码进行编写 随着学习的深入&#x…

对象***已断开连接或不在该服务器上 的解决方案之一

使用VS2008在发布网站的时候&#xff0c;出现了这样的一个错误&#xff0c;先前一直是OK的。网上找了老半天&#xff0c;几乎没有此问题的解决办法。很是郁闷。只能一个一个地进行编译。单个层Build是OK的&#xff0c;整个Solution的Rebuild也是OK的&#xff0c;一开始使用VS自…

Web.XML文件中关于代码提示的一些问题

1. 问题描述 在进行ssm的整合时&#xff0c;我发现在web.xml文件中里按了alt/以后没有下面的提示&#xff1a;这样真的很不爽。。。于是弄了半天&#xff08;主要是等着&#xff09;终于解决了&#xff0c;特此写篇博客记录下。 2. 解决方案 在eclipse中安装Spring IDE的插件&a…

安卓开发之点九图

Nine-Patch图 xxx.9.png 口诀&#xff1a;左上进行拉伸&#xff0c;右下进行显示。

ImportError: No module named images

&#xff3b;问题&#xff3d; 在使用学习wxPython时&#xff0c;一个Dem抱有如题所示错误 &#xff3b;解决&#xff3d; images 只不过是wxpython自带demo中的一个文件 体验wxpython IN action的时候ImportError: No module named images替换为import wx.py.images as images…

从 Java 到 Scala(二):object

本文由 Rhyme 发表在 ScalaCool 团队博客。 object是一种让静态回归常态、打破模式、天然的语言特性。 其实在写这篇文章之前&#xff0c;我思绪万千&#xff0c;迟迟不能落笔&#xff0c;总想着自己会不会遗漏了某个知识点&#xff0c;或者有讲得不太那么准确的地方&#xff0…

Python获取屏幕分辨率大小

获取屏幕大小有两种方法可以办到: 1.wxPython里的 2.win32api 1 #coding:gb23122 #wxApp.py 3 #author: aoogur4 importos5 importwx6 fromwin32api importGetSystemMetrics7 8 classFrame(wx.Frame):9 def__init__(self):10 wx.Frame.__init__(self,None,-1,title"wxApp.…

安卓事件传递机制

1.触摸事件 MotionEvent ACTION_DOWN:按下 ACTION_MOVE:移动 ACTION_UP:松开 2.以上三个触摸事件都会经历三个函数 事件分发&#xff08;Dispatch&#xff09;&#xff1a;dispatchTouchEvent 事件拦截 &#xff08;Intercept&#xff09;&#xff1a;onInterceptTouchEvent 事…

财务软件的管理监督

随着现代企业的发展&#xff0c;企业财务管理的内涵、外延、功能及其地位发生了深刻的变化&#xff0c;强化企业的财务管理已经成为现代企业在激烈的市场竞争中得以生存和发展、现代企业制度得以保证和实施的重要环节。财务管理软件的应用已经非常普及了。 现代企业财务管…

[Vue CLI 3] 插件编写实战和源码分析

当你看过了官方的几个插件之后&#xff0c;慢慢地&#xff0c;其实你也有需求了。 那如何编写一个 Vue CLI 3 的插件呢&#xff1f;本文代码已经放到 github 上&#xff0c;地址&#xff1a;https://github.com/dailynodej... 我们建一个文件夹&#xff0c;取名 vue-cli-plugin…

突然想起99年的那次离别

今天妹妹离开成都回家了突然发现某一件事情又那么蹿了出来了&#xff0c;是99年的秋天那次&#xff0c;同f到成都且分开的那短暂的2天&#xff01;很多年了&#xff0c;不知道是忘记了再回忆起&#xff0c;还是一直埋在最深处&#xff0c;瞬间又重现&#xff01;想了&#xff0…

列表组件之ListView

1.ListView是什么 一个显示可滚动项目的视图组件系统使用Adapter(适配器)将列表项目插入列表适配器从来源提取内容 下图从MVC分析的话&#xff0c;ListView相当于View&#xff0c;Adapter相当于Controller&#xff0c;data相当于Model 缺点&#xff1a;屏幕里面只能展示有限个…

C#杂记系列之日期函数

//2008年4月24日 System.DateTime.Now.ToString("D"); //2008-4-24 System.DateTime.Now.ToString("d"); //2008年4月24日 16:30:15 System.DateTime.Now.ToString("F"); //2008年4月24日 16:30 System.DateTime.Now.ToString("f"); /…

对着电脑笑了二十分钟(2)

25、有一次我大叔见我小姑在搽大宝&#xff0c;突然大叫一声&#xff1a;“你皮肤这么好&#xff0c;还用护舒宝啊&#xff1f;”26、老师留下作业&#xff0c;我不会做就抄别人的&#xff0c;然后去办公室交作业&#xff0c;看见老师说&#xff1a;“我抄完了&#xff01;”27…

ORACLE临时表空间

https://www.cnblogs.com/kerrycode/p/4006840.html转载于:https://www.cnblogs.com/elontian/p/9564296.html

列表组件之RecyclerView

灵活体现在 ListView 只支持上下滑动 RecyclerView 可以左右滑动&#xff0c;可以瀑布流 并且默认支持布局&#xff1a;线性布局、网络布局 RecyclerView将很多固定模式的地方抽象出来了&#xff0c;如用于动画的ItemAnimator和用于布局的LayoutManager Adapet的特点 1.ViewHo…

【WPF】一个简单的ColorPicker控件

在斯克迪亚看到一篇WPF动态改变主题颜色的文章&#xff0c;来了兴趣&#xff0c;于是自己搞了个简单的ColorPicker控件。 控件其实很简单&#xff0c;定义了5个依赖属性 FinalBrushProperty, AProperty, RProperty, GProperty, BProperty 然后当A,R,G,B发生变化时&#xff0c;…

javascript 利用 - 枚举思想 - 添加地名的一个小例子

利用枚举思想来添加地名&#xff0c;主要功能是&#xff1a;判断点击a标签&#xff08;即当前的地名&#xff09;如果在ul的li不存在的话那么就添加&#xff0c;有则不添加&#xff0c;而且还提供了相应的排序功能... HTML代码&#xff1a; <div id"china"> &l…

[MaxCompute MapReduce实践]通过简单瘦身,解决Dataworks 10M文件限制问题

用户在DataWorks上执行MapReduce作业的时候&#xff0c;文件大于10M的JAR和资源文件不能上传到Dataworks&#xff0c;导致无法使用调度去定期执行MapReduce作业。 解决方案&#xff1a; 第一步&#xff1a;大于10M的resources通过MaxCompute CLI客户端上传&#xff0c; 客户端下…

根据给定数据创建JSON并验证

首先可以判断&#xff0c;temp和weather的值是对象&#xff0c;success的值为布尔型&#xff0c;notification的值为一个数组 {"temp":{"min":11.34,"max":19.01},"weather":{"id":"801","condition":…

C# + MySql 存贮过程开发示例

MySql 发展至今&#xff0c;已经不是当初那个只依靠免费和速度取胜的开源数据库服务器了&#xff0c;它提供的一系列 GUI 工具&#xff0c;以及加入商业数据库的一些特性&#xff0c;依然免费并且开源&#xff0c;让我们实在无法拒绝它的魅力。 很多人在谈及 MySql 可能会条件反…

[C#]判断是否是合法的IP4,IP6地址

判断一个字符串如果没有端口的话&#xff0c;利用IPAddress.TryParse很好判断&#xff0c;那么有端口怎么判断呢&#xff0c;正则表达式&#xff1f;还是其他方式&#xff1f; 关键代码&#xff1a; /// <summary>/// 判断是否是合法的IP4,IP6地址/// </summary>//…

Centos 7使用vsftpd搭建FTP服务器

FTP&#xff0c;即&#xff1a;文件传输协议&#xff08;File Transfer Protocol&#xff09;&#xff0c;基于客户端/服务器模式&#xff0c;默认使用20、21端口号&#xff0c;其中端口20&#xff08;数据端口&#xff09;用于进行数据传输&#xff0c;端口21&#xff08;命令…

Android中的网络(字节跳动)

文章目录RESTful API对REST的解释资源与URI什么是URIHTTP URL的组成Http 接口JSONHttp资源XMLJSONAndroid中对JSON的处理方法一&#xff1a;org.json.JSONObject方法二&#xff1a;GSON(toJson,fromJson)RetrofitRESTful API 对REST的解释 REST描述的是在网络中客户端和服务端…

编写和调试Shader程序(1)

编写和调试Shader程序&#xff08;1&#xff09;DirectX EffectEditJohnsonFeng常用的Shader编写程序有ATI Render Monkey和NVIDIA FX Composer,另外还有DirectX自带的EffectEdit。这几款工具都比较容易上手&#xff0c;本文先介绍DirectX的EffectEdit。EffectEdit是DirectX9.0…