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