3.问题二,如何让离线高效的利用空闲 CPU?
那么就来看第二个问题,离线如何高效的利用空闲 CPU?因为当有在线的时候,离线无法获得 CPU,因此要让离线高效的获得 CPU,第一个需要解决的是,离线如何去感知在线剩余的算力?在线占用 100%的核上,是不应该调度离线过去运行的,因为离线一直获得不了 CPU。在线占用 60%与在线占用 10%的 CPU 上,应该调度不同负载的离线去运行。
离线如何高效的利用空闲 CPU?
因此,在线感知剩余算力很关键,那么怎么做的呢?我们最开始是如果负载均衡的时候,这个核有在线在运行就不调度离线过来,此种做法比较粗糙,波动很大效果不明显。因此我们对此进行了优化,离线算力算法如下:
(1)1-avg/T=离线负载算力
(2)avg 随之 T 不断衰减,过一个 T 衰减成原来的 1/2
(3)在线的运行时间不断加入 avg 中
直接看文字很难懂,举个例子;比如在线占用 CPU100%,T=1ms
那么离线算力=1-(1/2+1/4+1/8+1/16+…)=0 ,也就是说算出来离线的算力是 0,因此这个核上在线占着 100%的 CPU。
如果在线占用 20%的 CPU,T=1ms,那么离线算力=1-(0.2/2+0.2/4+0.2/8+…)=0.8,因此,可以迁移一些离线进程到这个核上。
另外,第二个是我们引入了等待延迟,用于优化进程负载的计算。为什么要引入等待时间呢?因为我们发现,如果用原来的算法,在业务限制某个 CPU 不让离线运行时候,这个离线进程可能无法被调走(比如说,四个 CPU,四个离线,限制一个核,按照原来算法负载是均衡的)。另外我们在测试中发现,离线在在线混部上来之后,离线的队列等待时间会增大,缩短离线进程在队列中的等待时间,是提高离线 CPU 占有效率的关键。因此,我们引入了队列等待时间,通过等待时间算出一个翻倍因子,从而在负载均衡的时候,将最应该被调度的离线进程及时调度到空 CPU 上运行。
四、新方案效果
目前 TLinux 团队混部方案的效果多个业务上都得到了验证,功能满足业务需求,在不影响在线业务的前提下,整机 CPU 利用率提升非常显著,超过业务预期。下面是几个典型场景的测试数据。
如下图所示,在 A 测试场景中,模块 a 一个用于统计频率的模块,对时延非常敏感。此业务不能混部,整机 CPU 利用率只有 15%左右,业务尝试过使用 cgroup 方案来混部,但是 cgroup 方案混部之后,对在线模块 a 影响太大,导致错误次数陡增,因此此模块一直不能混部。使用我们提供的方案之后,可以发现,CPU 提升至 60%,并且错误次数基本没有变化。
业务场景 A(a 模块)混部前后性能对比
在 B 测试场景中(模块 b 是一个翻译模块,对时延很敏感),原本 b 模块是不能混部的,业务尝试过混部,但是因为离线混部上去之后对模块 b 的影响很大,时延变长,所以一直不能混部。使用我们的方案的效果如下图所示,整机 CPU 利用率从 20%提升至 50%,并且对模块没有影响,时延基本上没有变化。
业务场景 B(b 模块)混部前后性能对比
模块 C 对时延不像场景 A,B 那么敏感,所以在使用我们提供的方案之前,利用 cgroup 方案进行混部,CPU 最高可以达到 40%。但是平台不再敢往上压,因为再往上压就会影响到在线 c 业务。如下图所示,使用我们的方案之后,平台不断往机器上添加离线业务,将机器 CPU 压至 90%的情况下,c 业务的各项指标还是正常,并没有受到影响。
C 场景(c 模块)业务混部前后性能对比
TLinux 团队从今年三月份就开始在各业务场景中进行测试灰度,期间遇到了各种各样的问题,不断的优化完善。验证的结果是:TLinux 团队混部方案在不影响在线业务的前提下,能够大幅度提升整机 CPU 的利用率,能为公司节省大量的运营成本。目前 TLinux 团队提供的公司内部内核,已经完全支持 TLinux 团队混部方案,公司很多业务已经开始使用 TLinux 团队提供的混部方案。
TLinux 团队简介
TLinux 团队承载了腾讯公司级的服务器操作系统、内核、发行版及虚拟化研发任务,专注解决 TLinux 系统、内核、网络、虚拟化平台及文件系统的问题。在历次的考验中,承受住了服务器数量飙升的压力,为腾讯提供了稳定、持久的服务。
本文转载自公众号云加社区(ID:QcloudCommunity)。
原文链接:
https://mp.weixin.qq.com/s/dC-G74XtlnRzFTQmZdC19A
评论