来,通过CPU Burst温习下概率论 | 龙蜥技术

简介: CPU Burst会不会对实际业务场景造成影响?怎么通过模拟工具验证?

cpu终.png

在系列文章上篇和中篇(参考相关阅读),我们介绍了优化效果,并且评估了影响。而在本文中,我们将进一步展示详细的模拟结果,通过分析这些不同场景的结果给出结论和建议;我们还会介绍采集和模拟工具,使读者能针对自己的业务场景进行评估。


相关阅读:

上篇:干掉讨厌的 CPU 限流,让容器跑得更快 | 龙蜥技术

中篇:CPU Burst 有副作用吗?让数学来回答!| 龙蜥技术


场景和参数设定

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

1.png

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


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


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

参数

描述

distribution

计算需求产生的分布

负指数、帕累托

u_avg

平均产生的计算需求

10%-90%

m

cgroup(容器)个数

10、20、30

b

令牌桶的buffer大小(相对于其quota的倍率)

100%、200%、∞

负指数分布是排队论模型中最常见、最多被使用的分布之一。其密度函数为image (4).png,其中image (1).png


帕累托分布是计算机调度系统中比较常见的分布,且它能够模拟出较大的延迟长尾,从而体现 CPU Burst 的效果。其密度函数为image (2).png。为了抑制尾部的概率分布使其不至于过于夸张,我们设置了image (3).png,此时当 u_avg=30% 时可能产生的最大计算需求约为 500%。


数据展示

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

负指数分布

2.png3.png

帕累托分布

4.png5.png

结论

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


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


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


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

模拟工具与使用方法

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

工具可以在这里获取:

https://codeup.openanolis.cn/codeup/yingyu/cpuburst-simulator


详细的使用说明也附在 README 中了,下面让我们看一个具体的例子吧。


小A想在他的服务器上部署 10 台容器用于相同业务。为了获取准确的测量数据,他先启动了一台容器正常运行业务,绑定到名为 cg1 的 cgroup 中,不设限流以获取该业务的真实表现。然后调用 sample.py  进行数据采集:(演示效果只采集了 1000 次,实际建议有条件的情况下采集次数越大越好)6.png

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


接下来,他利用 simu_from_data.py 计算配置 10个 和 cg1 相同场景的 cgroup 时,将 buffer 设置为 200% 的影响:7.png根据模拟结果,开启 CPU Burst 功能对该业务场景下的容器几乎没有负面影响,小A可以放心使用啦。


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


关于作者

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

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

加入社区 SIG

SIG 地址

官网:https://openanolis.cn/sig/java/doc/216166872482840581

sig截图.png

—— 完 ——


加入龙蜥社群

加入微信群:添加社区助理-龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】拉你入群;加入钉钉群:扫描下方钉钉群二维码。欢迎开发者/用户加入龙蜥社区(OpenAnolis)交流,共同推进龙蜥社区的发展,一起打造一个活跃的、健康的开源操作系统生态!

1.jpeg          龙蜥助手.jpeg

龙蜥社区钉钉交流群                            龙蜥社区-小龙


关于龙蜥社区

龙蜥社区(OpenAnolis)是由企事业单位、高等院校、科研单位、非营利性组织、个人等按照自愿、平等、开源、协作的基础上组成的非盈利性开源社区。龙蜥社区成立于2020年9月,旨在构建一个开源、中立、开放的Linux上游发行版社区及创新平台。

短期目标是开发龙蜥操作系统(Anolis OS)作为CentOS替代版,重新构建一个兼容国际Linux主流厂商发行版。中长期目标是探索打造一个面向未来的操作系统,建立统一的开源操作系统生态,孵化创新开源项目,繁荣开源生态。

龙蜥OS 8.4已发布,支持x86_64和ARM64架构,完善适配Intel、飞腾、海光、兆芯、鲲鹏芯片。

欢迎下载:

https://openanolis.cn/download

加入我们,一起打造面向未来的开源操作系统!

https://openanolis.cn

相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
相关文章
|
10月前
|
算法 编译器
【计算机架构】响应时间和吞吐量 | 相对性能 | 计算 CPU 时间 | 指令技术与 CPI | T=CC/CR, CC=IC*CPI
【计算机架构】响应时间和吞吐量 | 相对性能 | 计算 CPU 时间 | 指令技术与 CPI | T=CC/CR, CC=IC*CPI
879 1
|
16天前
|
KVM 虚拟化
KVM的热添加技术之CPU
这篇文章介绍了如何在KVM虚拟机中热添加CPU资源,包括查看当前CPU配置、修改CPU核心数、永久性修改CPU配置以及注意事项等操作步骤。
37 1
KVM的热添加技术之CPU
|
3月前
|
监控 Java API
使用Java检测当前CPU负载状态的技术博客
使用Java检测当前CPU负载状态的技术博客
61 0
|
4月前
|
异构计算
振南技术干货集:CPU,你省省心吧!(2)
振南技术干货集:CPU,你省省心吧!(2)
|
10月前
|
存储 Linux Docker
跨cpu架构部署容器技术点:怎样修改Linux 的内核版本
在使用Docker 进行跨平台部署之后,我们还可以尝试进行跨架构部署。 从X86 架构上移植到 aarch64 上。
237 0
|
10月前
|
NoSQL Shell Linux
跨cpu架构部署容器技术点:怎么将容器启动时的1号进程挂载到systemctl
--privileged=true:是Docker中的一个参数,用于授予容器的特权权限。当一个容器被设置为特权容器时,它将拥有与主机操作系统相同的权限,可以执行一些高级操作,如访问主机设备、加载内核模块等。
81 0
|
关系型数据库 C语言
VT技术(二)检测CPU支持
1.CPUID指令检测 在进入VMX Opreation之前必须要检测CPU是否支持VMX技术,可以通过CPUID指令进行查询,在执行CPUID指令之后,返回值存入EAX,EBX,ECX,EDX中,查看ECX.VMX[5]位是否为1,否则不支持VMX技术,关于CPUID指令的介绍可以参考Intel白皮书卷二第三章第三节 Instruction-CPUID Identification详细介绍了CPUID的参数
418 0
|
Cloud Native Linux 应用服务中间件
助力Koordinator云原生单机混部,龙蜥混部技术提升CPU利用率达60%|龙蜥技术
龙蜥社区的三大原生技术为 Koordinator 社区提供了强大的 CPU 混部底层技术支持。
助力Koordinator云原生单机混部,龙蜥混部技术提升CPU利用率达60%|龙蜥技术
|
存储 缓存 Java
【优化技术专题】「底层架构原理系列」CPU处理器鲜为人知的那些秘密
【优化技术专题】「底层架构原理系列」CPU处理器鲜为人知的那些秘密
381 0
【优化技术专题】「底层架构原理系列」CPU处理器鲜为人知的那些秘密
|
算法 Linux 调度
互联网+大赛 - 龙蜥社区赛题(限制 CFS 调度的 CPU 并发度)|学习笔记
快速学习互联网+大赛 - 龙蜥社区赛题(限制 CFS 调度的 CPU 并发度)

热门文章

最新文章