让容器跑得更快:CPU Burst 技术实践

简介:让人讨厌的 CPU 限流影响容器运行,有时人们不得不牺牲容器部署密度来避免 CPU 限流出现。我们设计的 CPU Burst 技术既能保证容器运行服务质量,又不降低容器部署密度。CPU Burst 特性已合入 Linux 5.14,Anolis OS 8.2、Alibaba Cloud Linux2、Alibaba Cloud Linux3 也都支持 CPU Burst 特性。

作者:常怀鑫、丁天琛

让人讨厌的 CPU 限流影响容器运行,有时人们不得不牺牲容器部署密度来避免 CPU 限流出现。我们设计的 CPU Burst 技术既能保证容器运行服务质量,又不降低容器部署密度。CPU Burst 特性已合入 Linux 5.14,Anolis OS 8.2、Alibaba Cloud Linux2、Alibaba Cloud Linux3 也都支持 CPU Burst 特性。

在 K8s 容器调度中,容器的 CPU 资源上限是由 CPU limits 参数指定。设置 CPU 资源上限可以限制个别容器消耗过多的 CPU 运行时间,并确保其他容器拿到足够的 CPU 资源。CPU limits 限制在 Linux 内核中是用 CPU Bandwidth Controller 实现的,它通过 CPU 限流限制 cgroup 的资源消耗。所以当一个容器中的进程使用了超过 CPU limits 的资源的时候,这些进程就会被 CPU 限流,他们使用的 CPU 时间就会受到限制,进程中一些关键的延迟指标就会变差。

面对这种情况,我们应该怎么办呢?一般情况下,我们会结合这个容器日常峰值的 CPU 利用率并乘以一个相对安全的系数来设置这个容器的 CPU limits ,这样我们既可以避免容器因为限流而导致的服务质量变差,同时也可以兼顾 CPU 资源的利用。举个简单的例子,我们有一个容器,他日常峰值的 CPU 使用率在 250% 左右,那么我们就把容器 CPU limits 设置到 400% 来保证容器服务质量,此时容器的 CPU 利用率是 62.5%(250%/400%)。

然而生活真的那么美好吗?显然不是!CPU 限流的出现比预期频繁了很多。怎么办?似乎看上去我们只能继续调大 CPU limits 来解决这个问题。很多时候,当容器的 CPU limits 被放大 5~10 倍的时候,这个容器的服务质量才得到了比较好的保障,相应的这时容器的总 CPU 利用率只有 10%~20%。所以为了应对可能的容器 CPU 使用高峰,容器的部署密度必须大大降低。

历史上人们在 CPU Bandwidth Controller 中修复了一些 BUG 导致的 CPU 限流问题,我们发现当前非预期限流是由于 100ms 级别 CPU 突发使用引起,并且提出 CPU Burst 技术允许一定的 CPU 突发使用,避免平均 CPU 利用率低于限制时的 CPU 限流。在云计算场景中,CPU Burst 技术的价值有:

  1. 不提高 CPU 配置的前提下改善 CPU 资源服务质量;
  2. 允许资源所有者不牺牲资源服务质量降低 CPU 资源配置,提升 CPU 资源利用率;
  3. 降低资源成本(TCO,Total Cost of Ownership)。

你看到的 CPU 利用率不是全部真相

秒级 CPU 利用率不能反映 Bandwidth Controller 工作的 100ms 级别 CPU 使用情况,是导致非预期 CPU 限流出现的原因。

Bandwidth Controller 适用于 CFS 任务,用 period 和 quota 管理 cgroup 的 CPU 时间消耗。若 cgroup 的 period 是 100ms quota 是 50ms,cgroup 的进程每 100ms 周期内最多使用 50ms CPU 时间。当 100ms 周期的 CPU 使用超过 50ms 时进程会被限流,cgroup 的 CPU 使用被限制到 50%。

CPU 利用率是一段时间内 CPU 使用的平均,以较粗的粒度统计 CPU 的使用需求,CPU 利用率趋向稳定;当观察的粒度变细,CPU 使用的突发特征更明显。以 1s 粒度和 100ms 粒度同时观测容器负载运行,当观测粒度是 1s 时 CPU 利用率的秒级平均在 250% 左右,而在 Bandwidth Controller 工作的 100ms 级别观测 CPU 利用率的峰值已经突破 400% 。

1.png

根据秒级观察到的 CPU 利用率 250% 设置容器 quota 和 period 分别为 400ms 和 100ms ,容器进程的细粒度突发被 Bandwidth Controller 限流,容器进程的 CPU 使用受到影响。

如何改善

我们用 CPU Burst 技术来满足这种细粒度 CPU 突发需求,在传统的 CPU Bandwidth Controller quota 和 period 基础上引入 burst 的概念。当容器的 CPU 使用低于 quota 时,可用于突发的 burst 资源累积下来;当容器的 CPU 使用超过 quota,允许使用累积的 burst 资源。最终达到的效果是将容器更长时间的平均 CPU 消耗限制在 quota 范围内,允许短时间内的 CPU 使用超过其 quota。

2.png

如果用 Bandwidth Controller 算法来管理休假,假期管理的周期(period)是一年,一年里假期的额度是 quota ,有了 CPU Burst 技术之后今年修不完的假期可以放到以后来休了。

在容器场景中使用 CPU Burst 之后,测试容器的服务质量显著提升。观察到 RT 均值下降 68%(从 30+ms 下降到 9.6ms );99%  RT 下降 94.5%(从 500+ms 下降到 27.37ms )。

3.png

CPU Bandwidth Controller 的保证

使用 CPU Bandwidth Controller 可以避免某些进程消耗过多 CPU 时间,并确保所有需要 CPU 的进程都拿到足够的 CPU 时间。之所以有这样好的稳定性保证,是因为当 Bandwidth Controller 设置满足下述情况时,

4.png

有如下的调度稳定性约束:

5.png

其中,

6.png

是第 i 个 cgroup 的 quota,是一个 period 内该 cgroup 的 CPU 需求。Bandwidth Controller 对每个周期分别做 CPU 时间统计,调度稳定性约束保证在一个 period 内提交的全部任务都能在该周期内处理完;对每个 CPU cgroup 而言,这意味着任何时候提交的任务都能在一个 period 内执行完,即任务实时性约束:

7.png

不管任务优先级如何,最坏情况下任务执行时间(WCET, Worst-Case Execution Time)不超过一个 period。

假如持续出现

8.png

调度器稳定性被打破,在每个 period 都有任务积攒下来,新提交的作业执行时间不断增加。

使用 CPU Burst 的影响

出于改善服务质量的需要,我们使用 CPU Burst 允许突发的 CPU 使用之后,对调度器的稳定性产生什么影响?答案是当多个 cgroup 同时突发使用 CPU,调度器稳定性约束和任务实时性保证有可能被打破。这时候两个约束得到保证的概率是关键,如果两个约束得到保证的概率很高,对大多数周期来任务实时性都得到保证,可以放心大胆使用 CPU Burst;如果任务实时性得到保证的概率很低,这时候要改善服务质量不能直接使用 CPU Burst,应该先降低部署密度提高 CPU 资源配置。

于是下一个关心的问题是,怎么计算特定场景下两个约束被打破的概率。

评估影响大小

定量计算可以定义成经典的排队论问题,并且用蒙特卡洛模拟方法求解。定量计算的结果表明,判断当前场景是否可以使用 CPU Burst 的主要影响因素是平均 CPU 利用率和 cgroup 数目。CPU 利用率越低,或者 cgroup 数目越多,两个约束越不容易被打破可以放心使用 CPU Burst。反之如果 CPU 利用率很高或者 cgroup 数目较少,要消除 CPU 限流对进程执行的影响,应该降低部署提高配置再使用 CPU Burst。

问题定义是:一共有 m 个 cgroup,每个 cgroup 的 quota 限制为 1/m,每个 cgroup 在每个周期产生的计算需求(CPU 利用率)服从某个具体分布,这些分布是相互独立的。假设任务在每个周期的开始到达,如果该周期内的 CPU 需求超过 100%,当前周期任务 WCET 超过 1 个 period,超过的部分累积下来和下个周期新产生的 CPU 需求一起在下个需求处理。输入是 cgroup 的数目 m 和每个 CPU 需求满足的具体分布,输出是每个周期结束 WCET > period 的概率和 WCET 期望。

以输入的 CPU 需求为帕累托分布、m=10/20/30 的结果为例进行说明。选择帕累托分布进行说明的原因是它产生比较多的长尾 CPU 突发使用,容易产生较大影响。表格中数据项的格式为

9.png

其中

10.png

越接近 1 越好,

11.png

概率越低越好。

结果跟直觉是吻合的。一方面,CPU 需求(CPU 利用率)越高,CPU 突发越容易打破稳定性约束,造成任务 WCET 期望变长。另一方面,CPU 需求独立分布的 cgroup 数目越多,它们同时产生 CPU 突发需求的可能性越低,调度器稳定性约束越容易保持,WCET 的期望越接近 1 个 period。

场景和参数设定

我们设定整个系统存在 m 个 cgroup,每个 cgroup 公平瓜分总量为 100% 的 CPU 资源,即 quota=1/m。每个 cgoup 按相同规律(独立同分布)产生计算需求并交给 CPU 执行。

12.png

我们参考排队论的模型,将每个 cgroup 视为一位顾客,CPU 即为服务台,每位顾客的服务时间受到 quota 的限制。为了简化模型,我们离散化地定义所有顾客的到达时间间隔为常数,然后在该间隔内 CPU 最多能服务 100% 的计算需求,这个时间间隔即为一个周期。

然后我们需要定义每位顾客在一个周期内的服务时间。我们假定顾客产生的计算需求是独立同分布的,其平均值是自身 quota 的 u_avg 倍。顾客在每个周期得不到满足的计算需求会一直累积,它每个周期向服务台提交的服务时间取决于它自身的计算需求和系统允许的最大 CPU time(即其 quota 加上之前周期累积的 token)。

最后,CPU Burst 技术中有一项可调参数 buffer,表示允许累积的 token 上限。它决定了每个 cgroup 的瞬时突发能力,我们将其大小用 quota 的 b 倍表示。

我们对上述定义的参数作出了如下设置:

负指数分布是排队论模型中最常见、最多被使用的分布之一。其密度函数为

13.png

其中

14.png

帕累托分布是计算机调度系统中比较常见的分布,且它能够模拟出较大的延迟长尾,从而体现 CPU Burst 的效果。其密度函数为:

15.png

为了抑制尾部的概率分布使其不至于过于夸张,我们设置了:

16.png

此时当 u_avg=30% 时可能产生的最大计算需求约为 500%。

数据展示

按上述参数设置进行蒙特卡洛模拟的结果如下所示。我们将第一张(WCET 期望)的图表 y 轴进行颠倒来更好地符合直觉。同样地,第二张图表(WCET 等于 1 的概率)表示调度的实时性得到保证的概率,以百分制表示。

负指数分布

17.png

18.png

帕累托分布

19.png

20.png

结论

一般来说,u_avg(计算需求的负荷)越高,m(cgroup 数量)越少,WCET 越大。前者是显然的结论,后者是因为独立同分布情况下任务数量越多,整体产生需求越趋于平均,超出 quota 需求的任务和低于 quota 从而空出 cpu 时间的任务更容易互补。

提高 buffer 会使得 CPU Burst 发挥更好的效果,对单个任务的优化收益更明显;但同时也会增大 WCET,意味着增加对相邻任务的干扰。这也是符合直觉的结论。

在设置 buffer 大小时,我们建议根据具体业务场景的计算需求(包括分布和均值)和容器数量,以及自身需求来决定。如果希望增加整体系统的吞吐量,以及在平均负荷不高的情况下优化容器性能,可以增大 buffer;反之如果希望保证调度的稳定性和公平性,在整体负荷较高的情况下减少容器受到的影响,可以适当减小 buffer。

一般而言,在低于 70% 平均 CPU 利用率的场景中,CPU Burst 不会对相邻容器造成较大影响。

模拟工具与使用方法

说完了枯燥的数据和结论,接下来介绍可能有许多读者关心的问题:CPU Burst 会不会对我的实际业务场景造成影响?为了解决这个疑惑,我们将蒙特卡洛模拟方法所用工具稍加改造,从而能帮助大家在自己的实际场景中测试具体的影响~

工具可以在这里获取:cpuburst-simulator · 研发工作台 · OpenAnolis社区

详细的使用说明也附在 README 中了,下面让我们看一个具体的例子吧。
小 A 想在他的服务器上部署 10 台容器用于相同业务。为了获取准确的测量数据,他先启动了一台容器正常运行业务,绑定到名为 cg1 的 cgroup 中,不设限流以获取该业务的真实表现。

然后调用 sample.py  进行数据采集:(演示效果只采集了 1000 次,实际建议有条件的情况下采集次数越大越好)

21.png

这些数据被存储到了./data/cg1_data.npy 中。最后输出的提示说明该业务平均占用了约 6.5% 的 CPU,部署 10 台容器的情况下总的平均 CPU 利用率约为 65%。(PS:方差数据同样打印出来作为参考,也许方差越大,越能从 CPU Burst 中受益哦)

接下来,他利用 simu_from_data.py 计算配置 10 个 和 cg1 相同场景的 cgroup 时,将 buffer 设置为 200% 的影响:

22.png

根据模拟结果,开启 CPU Burst 功能对该业务场景下的容器几乎没有负面影响,小 A 可以放心使用啦。

想要进一步了解该工具的用法,或是出于对理论的兴趣去改变分布查看模拟结果,都可以访问上面的仓库链接找到答案~

关于作者

常怀鑫(一斋),阿里云内核组工程师,擅长 CPU 调度领域。

丁天琛(鹰羽),2021 年加入阿里云内核组,目前在调度领域等方面学习研究。

原文链接
本文为阿里云原创内容,未经允许不得转载。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511798.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实时数仓Hologres首次走进阿里淘特双11

简介:这是淘特在阿里巴巴参与的第二个双11大促,大促期间累计超过上千万消费者在此买到心仪的商品,数百万家商家因为淘特而变得不同,未来,淘特也将会继续更好的服务于下沉市场,让惠民走近千万家。 2021年11…

Cluster 集群能支撑的数据有多大?

作者 | 码哥字节来源 | 码哥字节本文将对集群的节点、槽指派、命令执行、重新分片、转向、故障转移、消息等各个方面进行深入拆解。目的在于掌握什么是 Cluster ?Cluster 分片原理,客户端定位数据原理、故障切换,选主,什么场景使用…

All in one:如何搭建端到端可观测体系

简介:一文看懂可观测! 作者:西杰 & 白玙 可观测的前生今世 系统的可观测与故障可分析作为系统运维中重要的衡量标准,随着系统在架构、资源单位、资源获取方式、通信方式演进过程,遇到了巨大挑战。而这些挑战&am…

链路分析 K.O “五大经典问题”

简介:链路分析是基于已存储的全量链路明细数据,自由组合筛选条件与聚合维度进行实时分析,可以满足不同场景的自定义诊断需求。 作者:涯海 链路追踪的 “第三种玩法” 提起链路追踪,大家会很自然的想到使用调用链排查…

Kubernetes 上容器的启动顺序如何把控?

作者 | AddoZhang来源 | 云原生指北为什么要做容器启动顺序控制?我们都知道 Pod 中除了 init-container 之外,是允许添加多个容器的。类似 TektonCD 中 task 和 step 的概念就分别与 pod 和 container 对应,而 step 是按照顺序执行的。此外还…

一文说清linux system load

简介:双十一压测过程中,常见的问题之一就是load 飙高,通常这个时候业务上都有受影响,比如服务rt飙高,比如机器无法登录,比如机器上执行命令hang住等等。本文就来说说,什么是load,loa…

KubeDL 0.4.0 - Kubernetes AI 模型版本管理与追踪

简介:欢迎更多的用户试用 KubeDL,并向我们提出宝贵的意见,也期待有更多的开发者关注以及参与 KubeDL 社区的建设! 作者:陈裘凯( 求索) 前言 KubeDL 是阿里开源的基于 Kubernetes 的 AI 工作负…

上云一时爽,遇坑泪两行

如今,企业的数字化转型进程已经进入了“快车道”,各行各业基于自身业务发展与变革的需要,为整体数字化转型带来了更多要求。企业纷纷依托云原生、低代码、大数据、人工智能等技术手段积极加入这场没有硝烟的战争。 对于传统企业而言&#xf…

读研期间一定得看论文吗_读研期间各阶段的目标和任务,你明确吗?

读研期间一般都要经历上课、论文材料的收集、论文的开题、发表小论文、毕业论文的答辩、找工作或考博士等几个关键环节。在校期间,我们不仅要完成以上的全部工作,还需要不断地学习正确的价值观和人生观,学会科学的思考。如何让自己的研究生生…

Spring Boot Serverless 实战系列“架构篇” | 光速入门函数计算

简介:如何以 Serverless 的方式运行 Spring Boot 应用? 作者:西流(阿里云函数计算专家) Spring Boot 是基于 Java Spring 框架的套件,它预装了 Spring 一系列的组件,开发者只需要很少的配置即可…

从 “香农熵” 到 “告警降噪” ,如何提升告警精度?

简介:ARMS 智能降噪功能依托于 NLP 算法和信息熵理论建立模型,从大量历史告警事件中去挖掘这些事件的模式规律。当实时事件触发后,实时为每一条事件打上信息熵值与噪音识别的标签,帮助用户快速识别事件重要性。 作者:…

AI 机器学习如何不被底层资源和数据“拉胯”,听听亚马逊云科技怎么说

编辑 | 宋慧 出品 | CSDN 云计算 在人工智能从爆火到普及应用之后,数据分析今年又一次被技术界广泛关注,热度再次到达高点。 分析与咨询机构也纷纷发表与数据相关的报告,德勤在刚刚发布的《 2022年度技术趋势 》中,第一个趋势即是…

Flow vs Jenkins 实操对比,如何将Java应用快速发布至ECS

简介:Jenkins 由于其开源特性以及丰富插件能力,长久以来都是中小企业搭建 CICD 流程的首选。不过 Jenkins 存在维护成本高、配置复杂等缺点,云效 Flow 较好地解决了这些问题。 本文从一个 Java 应用部署到云服务器(ECS&#xff09…

CSS 中的简写到底有多少坑?以后不敢了...

作者 | 零一来源 | 前端印象简写(语法糖)可能给我们编码带来了很多便利,但简写也会带来一些问题,今天来讨论一下 CSS 中的简写的"爱恨情仇"为什么说是爱恨情仇呢?因为简写给我们带来了很多的便利&#xff0c…

智能巡检云监控指标的实践

简介:在真实的企业生产中,对研发和运维的同学都会面临一个十分繁复且艰难的问题,就是对指标的监控和告警。具体我枚举一些特定的问题请对号入座,看看在算力爆炸的时代能否通过算力和算法一起解决! 背景介绍 在真实的…

新常态成型,飞连联手Forrester聚焦数字化办公新体验

随着互联网技术不断发展,在企业办公领域时间与空间的限制正在逐步消弭。但是,当企业面对内外部大量的不确定因素时,以往的办公模式无论是效率、安全性还是体验等各方面都将大打折扣。而在数字时代,混合办公模式则有望成为企业办公…

聊聊我们在业务链路升级中做的数据洞察

简介:关于数据相关的词条很多,虽然有不同的定义,但是本质上是相辅相成,通常结合使用才能拿到结果。类比词条诸如 数据分析,数据挖掘, 数据洞察。本文将聊聊我们在业务链路升级中做的数据洞察。 作者 | 金铎…

阿里云佘俊泉:创新探索不停,边缘云持续为客户创造价值

简介:在12月15日上午举办的分布式云领袖论坛中,阿里云边缘云产品负责人佘俊泉先生发表了《阿里云边缘云产品创新与场景探索》的主题演讲,分享了阿里云在边缘云领域的探索和思考,如何从产品演进、技术创新、场景应用等方面助力企业…

oracle 如何迁移到 mysql_怎么将数据库从Oracle迁移到SQL Server,或从Oracle迁移到MySQL...

有时候我们有迁移数据库的需求,例如从Oracle迁移到SQL Server,或者从MySQL迁移到Oracle。很多江湖好汉一时不知如何手工操作,所幸的是Navicat提供了迁移的自动化操作界面。当然,Navicat的数据库迁移无法做到完美,一些依…

深度解析单线程的 Redis 如何做到每秒数万 QPS 的超高处理能力!

作者 | 张彦飞allen来源 | 开发内功修炼服务器端只需要单线程可以达到非常高的处理能力,Redis 就是一个非常好的例子。仅仅靠单线程就可以支撑起每秒数万 QPS 的高处理能力。今天我们就来带大家看看 Redis 核心网络模块的内部实现,学习下 Redis 是如何做…