Uber以标准化计算单元优化异构CPU调度
Uber在有状态编排平台Odin中引入标准化计算单元(Normalized Compute Units,NCU),用于解决异构服务器上CPU核心性能不一致带来的资源分配问题。该平台管理着约500万个CPU核心,覆盖本地数据中心和公有云中的多代x86服务器及ARM处理器。
不同处理器的单线程性能可能相差近一倍,因此同一工作负载在不同机器上所需的物理核心数量并不相同。若按最慢硬件分配资源,较快服务器的能力会被浪费;若按平均使用量分配,工作负载迁移到较慢机器后又可能资源不足。对无法轻易迁移流量的有状态服务而言,这还可能影响可靠性。
NCU将工作负载需要的计算能力与物理核心数量分离。Odin为每类服务器设定性能系数,并以较老一代硬件为基准100,部分新服务器的系数接近190。系数先通过硬件准入测试确定,再结合生产环境数据持续校准,将实际CPU使用量换算为标准化计算单位。
在这种机制下,同一工作负载部署到更快的服务器时可能分配较少核心,部署到较慢服务器时则分配更多核心,目标是让最终获得的计算能力接近,而不是让物理核心数保持一致。Uber发现,不同技术栈的结果也会不同,例如Kafka测试显示ARM、老款本地硬件与新款x86系统之间存在明显差异,因此不能只依赖合成基准测试。
无状态服务通常可以通过负载均衡,将请求转移到负载较低或性能更好的机器;有状态系统往往必须在保存特定分片或数据的服务器上处理请求。部分工作负载中,Leader的CPU消耗超过Follower十倍,若Leader从高性能服务器迁移到慢速服务器,即使业务负载不变,CPU占用也可能显著上升。
目前,NCU已用于Odin自动扩缩容工作负载中的约140万个CPU核心。Kafka在采用该方案前,不同服务器类型的CPU利用率相差约8个百分点,最高利用率比最低值高约50%;引入性能感知分配后,差距缩小至约3个百分点,最高值仅高出约10%。同时,Kafka的CPU总分配量减少约8%,主要节省来自性能更快的硬件。
这套模型与Kubernetes按核心或毫核计量的CPU抽象不同。Kubernetes将一个CPU单位定义为固定的CPU时间,便于构建可移植工作负载,但无法表达不同处理器代际之间的性能差异。NCU则让资源计量具备性能感知能力,关注每次CPU分配实际代表的计算能力。
本文基于公开渠道信息整理,内容可能存在不准确或遗漏之处,不代表本站立场,如内容涉及侵权或错误,请联系我们处理。
阅读原文