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.mzph.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…

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&#…

网络攻防技术实验五

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…

无法获取 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…

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 …

sql 左联接 全联接_通过了解自我联接将您SQL技能提升到一个新的水平

sql 左联接 全联接The last couple of blogs that I have written have been great for beginners ( Data Concepts Without Learning To Code or Developing A Data Scientist’s Mindset). But, I would really like to push myself to create content for other members of …

hadoop windows

1、安装JDK1.6或更高版本 官网下载JDK&#xff0c;安装时注意&#xff0c;最好不要安装到带有空格的路径名下&#xff0c;例如:Programe Files&#xff0c;否则在配置Hadoop的配置文件时会找不到JDK&#xff08;按相关说法&#xff0c;配置文件中的路径加引号即可解决&#xff…

科学价值 社交关系 大数据_服务的价值:数据科学和用户体验研究美好生活

科学价值 社交关系 大数据A crucial part of building a product is understanding exactly how it provides your customers with value. Understanding this is understanding how you fit into the lives of your customers, and should be central to how you build on wha…

在Ubuntu下创建hadoop组和hadoop用户

一、在Ubuntu下创建hadoop组和hadoop用户 增加hadoop用户组&#xff0c;同时在该组里增加hadoop用户&#xff0c;后续在涉及到hadoop操作时&#xff0c;我们使用该用户。 1、创建hadoop用户组 2、创建hadoop用户 sudo adduser -ingroup hadoop hadoop 回车后会提示输入新的UNIX…

vs azure web_在Azure中迁移和自动化Chrome Web爬网程序的指南。

vs azure webWebscraping as a required skill for many data-science related jobs is becoming increasingly desirable as more companies slowly migrate their processes to the cloud.随着越来越多的公司将其流程缓慢迁移到云中&#xff0c;将Web爬网作为许多与数据科学相…

hadoop eclipse windows

首先说一下本人的环境: Windows7 64位系统 Spring Tool Suite Version: 3.4.0.RELEASE Hadoop2.6.0 一&#xff0e;简介 Hadoop2.x之后没有Eclipse插件工具&#xff0c;我们就不能在Eclipse上调试代码&#xff0c;我们要把写好的java代码的MapReduce打包成jar然后在Linux上运…

netstat 在windows下和Linux下查看网络连接和端口占用

假设忽然起个服务&#xff0c;告诉我8080端口被占用了&#xff0c;OK&#xff0c;我要去看一下是什么服务正在占用着&#xff0c;能不能杀 先假设我是在Windows下&#xff1a; 第一列&#xff1a; Proto 协议 第二列&#xff1a; 本地地址【ip端口】 第三列&#xff1a;远程地址…