根据Gartner数据统计,2023年全球IT支出预计将达到4.7万亿美元,比2022年增长4.3%。然而,该机构另一项调查多个方面数据显示,全球数据中心服务器CPU利用率只有6%~12%。如何提升服务器资源利用率,降低IT基础设施的总拥有成本(TCO),以此来实现降本增效,成为企业未来的发展过程中的重要议题。
在此背景下,金山云推出在离线混部解决方案Colocation(以下简称“Colo”),该方案在知乎已完成大规模集群验证,集群资源利用率得到一定效果提升。通过在隔离类型上采用共享物理机内核、部署底座上采用容器部署、调度决策上采用动态决策,Colo具备6大功能特色,包括调度、重调度、资源隔离与限制、资源冲突检测与处理、可观测性以及节点实际负载查询API等。
从系统架构层面看,在离线混部解决方案Colo大致上可以分为5个层级,最重要的包含基础组件、资源管理和调度、节点管控、存储管理以及系统隔离。其中值得一提的是,Colo在资源调度侧增强了调度器相应的扩展能力,将调度器扩展为Colo-Manager、Colo-Scheuler、Colo-Descheuler,并在节点管控侧提供了cololet组件(如下图)。
Colo-Scheuler负责在线和离线应用调度,扩展负载均衡调度(包含CPU、Memory、CPI干扰)、重调度预调度(重调度驱逐时的安全策略)、ColocationFit插件。
Colo-Descheuler是一款重调度器,可扩展负载均衡调度插件。主要使用在于实时运行过程中,二次调度pod,扩展高级防护策略,按照Node、Namespace、Workload进行保护。
Cololet是节点级调度器,主要负责Pod的QoS保障。提供细粒度的资源使用指标、内核指标等监控指标的采集,实际负载数据的采集与保存,CPU、内存、BlkIO、Network等资源的冲突检测与动态调整,以及干扰探测等功能。
Colo-scheduler是基于社区scheduler framework框架开发的调度器,能够扩展感知离线资源可用量与在离线业务均衡分布的能力。根据Node节点实际负载指标计算得分并进行排序,为各个资源设置不同的权重值,实际剩余资源越多则得分越高,使得Pod在集群节点之间按照实际负载均衡分布。其离线可用资源计算公式为:
离线可用资源 =节点总可用资源 -节点预留资源 -系统已使用资源 -在线任务实际使用资源d - Pod(LS).Used
重调度器定期检测集群状态,对不符合预期的情况做动态调整,使集群始终处于健康状态。例如:当Node节点上Pod数量超越阈值或当某个Namespace中的Pod数量超越阈值时,均会触发Pod迁移;将Pod从实际利用率过高的节点迁移到利用率不足的节点;驱逐违反node affinity的Pod。
NUMA(非一致性内存访问)调度通过CPU分配策略与内存分配策略,最大化保证业务进程CPU访问内存的性能。
在 Priority和 QoS的使用上,二者整体是正交的两个维度,可以排列组合使用。不过受模型定义和实际的需求情况影响,部分排列组合存在约束。因此,建议的组合方式如下:
colo-prod & LS:适用于典型的在线服务,通常对应用的延迟、资源质量发展要求较高,运行时间较长,还需要保证一定的资源弹性能力。
colo-batch & BE:适用于混部场景中的低优离线任务,通常表现为对资源质量有相当的忍耐度,对延迟不敏感,运行时间相对较短,例如批处理类型的Spark/MR任务、AI训练任务等。
colo-prod & LSR/LSE:适用于比较敏感的在线服务,可以接受牺牲资源弹性而换取更好的确定性(如CPU邦核),对应用时延要求极高。
colo-mid/colo-free & BE:Colo-mid&BE适用于对资源要求比较高的离线任务,例如流式计算、近线计算等场景;colo-free&BE更适用于更低优先级的离线任务,例如研发人员的测试场景。
目前,金山云与知乎联合共建的Colo方案已在知乎完成了大规模部署,实现了大部分核心业务的落地,助力其混部集群利用率均值显著提升。
通过可观测性体系、动态决策、资源隔离、资源冲突检测与处理、调度等控制手段,充分保证混部服务稳定性。
弥补原项目资源预测、blkio/网络带宽限制、冲突检验测试能力、内存回收上的不足,额外支持eBPF内核指标采集、numa调度、节点实际负载查询API等功能。
未来,混合部署将随技术的发展而逐渐丰富,而金山云还将在提升资源利用率的宗旨下,基于容器调度场景,对Colo的功能特性持续来优化和升级。