下述为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内核热补丁技术揭秘相关推荐

  1. linux内核热修复,揭露内核黑科技 - 热补丁技术真容

    原创 理查德 Linux阅码场 6月12日 内核热补丁是一种无需重启操作系统,动态为内核打补丁的技术.系统管理员基于该技术,可以在不重启系统的情况下,修复内核BUG或安全漏洞,可以在最大程度上减少系统 ...

  2. Android 热补丁技术——资源的热修复

    前言 今年真是热补丁框架的洪荒之力爆发的一年,短短几个月内,已经出现了好几个热修复的框架了,基本上都是大同小异,这里我就不过多的去评论这些框架.只有自己真正的去经历过,你才会发现其中的 大写的坑 事实 ...

  3. 如何替换一个Linux内核函数的实现-热补丁原理

    昨晚发过誓了.不会再接着写二进制hook的手艺了,今天有网友咨询技术细节,终于又忍不住了- 为了不违背即便是胡乱说出口誓言,今天不写二进制hook,今天用C语言写,二进制只是沾点边儿! 看题目, 替换 ...

  4. Linux 4.1内核热补丁成功实践

    最开始公司运维同学反馈,个别宿主机上存在进程CPU峰值使用率异常的现象.而数万台机器中只出现了几例,也就是说万分之几的概率.监控产生的些小误差,不会造成宕机等严重后果,很容易就此被忽略了.但我们考虑到 ...

  5. 应用程序热补丁(一): 几行代码构造免重启修复补丁

    作者简介:王超,UCloud内核团队 前言 热补丁是一种在程序运行时动态修复内存中代码bug的技术.在UCloud,我们使用内核热补丁和应用程序热补丁(也就是进程热补丁)来在线修复核心业务的缺陷和安全 ...

  6. Linux内核热补丁方案对比

    Linux内核热补丁方案对比 荣涛 2021年10月13日 1. Linux 内核热补丁 1.1. linux 内核热补丁技术背景 1.1.1. update和upgrade的区别 1.1.1.1. ...

  7. Android热补丁动态修复技术

    Android热补丁动态修复技术(一):从Dex分包原理到热补丁 一.参考 博文:安卓App热补丁动态修复技术介绍--by QQ空间终端开发团队  博文:Android dex分包方案--by 猫的午 ...

  8. 云服务器文件电脑版,UCloud云主机文件管理工具

    UCloud云主机文件管理工具是一款相当优秀的文件管理工具.软件用途非常广泛,功能全面,能够帮助用户对存储空间内文件的管理操作,大大方便用户在本地进行云主机的文件管理,可以省心省事的管理文件. UCl ...

  9. 思科修复 ASA/FTD 防火墙高危缺陷,已遭利用

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 思科修复了一个高危且已遭利用的只读路径遍历漏洞 (CVE-2020-3452),它影响两款防火墙产品的 web 服务接口. 如遭成功利 ...

最新文章

  1. matlab的NLP功能,pyhanlp 共性分析与短语提取内容详解
  2. python代码壁纸-python设置windows桌面壁纸的实现代码
  3. mysql .pdb是什么文件_计算广告算法到底要做什么?
  4. Windows下安装配置SubVersion的简明步骤
  5. LeetCode 1218. 最长定差子序列(哈希map)
  6. enum和enum class
  7. 判断大小简单算法_算法浅谈——人人皆知却很多人写不对的二分法
  8. qtp12版本下载安装破解教程
  9. linux未找到make命令,linux中无make命令的问题(make: *** 没有指明目标并且找不到 makefile及make命令安装方法)...
  10. 【已经解决】TypeError: read_img() missing 1 required positional argument: ‘filename‘
  11. WebRTC sdp详解
  12. 三星GAST考试分享
  13. excel文件工作表保护快速撤销
  14. 2017滴滴校招 末尾0的个数(数学知识)
  15. sasl java_java SASL_SSL 帐号密码 方式访问 kafka
  16. 小程序笔记 -- 封装函数
  17. xml图片太大_XML的大图片还是Goo的大球图?
  18. Synctoy定时自动同步数据
  19. Android 高质量开发之崩溃优化,kotlinnativerust跨端
  20. 面向对象 编写 银行系统 实战

热门文章

  1. html5面板制作代码,HTML5绘制设备面板
  2. php定义常量mypi 3.14,php – Codeigniter 3使用未定义的常量VIEWPATH – 假设’VIEWPATH’...
  3. 西北师范计算机考研调剂,西北师范大学研究生调剂
  4. C语言 字符型操作(就自己做个笔记储存一下)
  5. CS131专题-6:图像特征(Blob检测、LoG算子、Harris-Laplacian)
  6. windows下opencv安装及配置(vs2010环境)
  7. 中国传媒大学计算机系湖北分数线,中国传媒大学录取分数线2019(在各省市录取数据)...
  8. 16 分频 32 分频是啥意思_Verilog中任意分频的实现
  9. 假如时光倒流,你依然会变成现在的你
  10. 【常用】细数那些常用的linux命令(只针对更新前端代码、上传文件到linux服务器)