加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 移动互联 > 正文

Linux 4.1内核热补丁成功实践

发布时间:2019-02-01 09:34:11 所属栏目:移动互联 来源:UCloud内核团队
导读:最开始公司运维同窗反馈,个体宿主机上存在历程CPU峰值行使率非常的征象。而数万台呆板中只呈现了几例,也就是说万分之几的概率。监控发生的些小偏差,不会造成宕机等严峻效果,很轻易就此被忽略了。 但我们思量到这个非常转瞬即逝、并不易被察觉,也许还
副问题[/!--empirenews.page--]

最开始公司运维同窗反馈,个体宿主机上存在历程CPU峰值行使率非常的征象。而数万台呆板中只呈现了几例,也就是说万分之几的概率。监控发生的些小偏差,不会造成宕机等严峻效果,很轻易就此被忽略了。

但我们思量到这个非常转瞬即逝、并不易被察觉,也许还存在更多这样的呆板,又可能此刻正常未来又不正常,内核研发本能的好奇心让我们感想:此事必有蹊跷!于是追查下去。

题目征象

征象一:CPU监控非0即100%

该题目征象示意在Redis历程CPU监控的峰值时而100% 时而为0,有的乃至是几异常钟都为0,突发1秒100%后又变为0,如下图。

Linux 4.1内核热补丁乐成实践

而从大量呆板的统计纪律看,这个征象在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 <pid> | grep<pid> , 可以看到历程的CPU操作率每隔几分钟到几异常钟呈现一次300%,这意味着该历程3个线程占用的3个CPU都跑满了,跟监控措施泛起同样的非常。

Linux 4.1内核热补丁乐成实践

题目说明

上述非常措施行使的是同样的数据源:/proc/pid/stat中历程运行占用的用户态时刻utime和内核态时刻stime。我们抓取utime和stime更新环境后,发明utime可能stime每隔几分钟可能几异常钟才更新,更新的步进值到达几百到1000+,而正常历程看到的是每几秒更新,步进值是几十。

定位到非常点后,还要找出缘故起因。解除了监控逻辑、IO负载、挪用瓶颈等也许后,确认是4.1内核的CPU时刻统计有 bug。

cputime统计逻辑

搜查/proc/pid/stat中utime和stime被更新的代码执行路径,在cputime_adjust()发明白一处可疑的处所:

Linux 4.1内核热补丁乐成实践

当utime+stime>=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。

Linux 4.1内核热补丁乐成实践

冷补丁和热补丁

第一回合:冷补丁

呈现题目的代码位置已经找到,那就先去内核社区看看有没有成熟补丁可用,看一下kernel/sched/cputime.c的 changelog,看到一个patch:确保stime+utime=rtime。再看描写:像top这样的器材,会呈现高出100%的操作率,之后又一段时刻为0,这不就是我们碰着的题目吗?真是踏破铁鞋无觅处,得来全不费韶光!(patch链接:https://lore.kernel.org/patchwork/patch/609410/)

Linux 4.1内核热补丁乐成实践 

该补丁在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已多次乐成应用的技能:热补丁技能。

所谓热补丁技能,是指在有缺陷的处事器内核或历程正在运行时,对已经加载到内存的措施二进制打上补丁,使得措施及时在线状态下执行新的正确逻辑。可以简朴领略为像关二爷那样不打麻药在苏醒状态下刮骨疗伤。虽然,对内核刮骨疗伤内核是不会痛的,但刮欠好内核就会直接死给你看,没有丝毫踌躇,很是爽性利索又耿直。

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读