Koordinator 助力云原生应用性能提升:小红书混部技术实践

作者:宋泽辉(小红书)、张佐玮(阿里云)

编者按:

Koordinator 是一个开源项目,是基于阿里巴巴内部多年容器调度、混部实践经验孵化诞生,是行业首个生产可用、面向大规模场景的开源混部系统,致力于提升应用服务质量,优化资源使用效率。自 2022 年 4 月正式开源以来,吸引了业界众多优秀工程师的贡献参与和讨论。

小红书是 Koordinator 社区的活跃成员,自项目诞生初期就深度参与了一系列重要功能的演进。本文是基于 2023 云栖大会上关于 Koordinator 分享的实录,Koordinator 社区成员宋泽辉(小红书)、张佐玮(阿里云)为大家介绍了小红书混部技术实践以及 Koordinator 的近期规划。

背景介绍

随着小红书业务的高速发展,各类在线,离线业务对于计算资源的需求也在快速增长。与此同时,部分在线集群天均利用率水位却维持在较低水平,造成这一现象的主要原因有以下几点:

  • 在线服务资源使用量随着终端用户的使用习惯呈现稳定的潮汐现象,夜间 CPU 利用率极低,导致集群均值 CPU 利用率较低;
  • 业务保有大量的独占资源池,资源池割裂产生大量的资源碎片,拉低 CPU 利用率;
  • 业务为了稳定性考虑,会过量囤积资源,进一步拉低 CPU 利用率。

基于以上背景,为了帮助业务降低资源使用成本,提升集群 CPU 利用率,小红书容器团队从 2022 年开始,通过规模化落地混部技术来大幅提升集群资源效能,降低业务资源成本。

技术演进

小红书混部技术演进分为以下四个阶段:

图片

阶段一:闲置资源再利用

早期集群资源管理粗放,集群中存在大量业务独占资源池,因为资源碎片等因素存在大量低分配率的低效节点,散落在各个集群中的低效节点形成大量资源浪费。另一方面,部分基于 K8s 发布的转码类近线/离线场景,全天时段均存在大量计算资源需求。基于以上背景,容器平台通过技术手段将集群中的闲置资源收集起来,分配给转码类业务场景使用。

我们通过 virtual-kubelet 打通元数据集群与物理集群,将闲置资源汇聚起来,在元数据集群分配给转码类场景近线/离线计算服务。策略方面,二次调度器负责巡检集群所有节点,识别为低效节点后标记出来,virtual-kubelet 获取物理集群中的低效节点可用资源作为集群闲置资源二次分配给离线转码,同时二次调度器需要保证一旦在线服务有资源需求,将会立刻驱逐离线 pod 并归还资源。

图片

阶段二:整机腾挪分时复用

搜推广等业务的独占资源池,CPU 利用率潮汐现象明显,夜间利用率极低,资源池中的单个节点往往也只部署一个大规格业务 Pod,基于以上背景,平台通过弹性能力(HPA),在凌晨业务低峰期按比例对在线业务缩容,腾挪空出整机,并将转码,训练等离线 pod 在该时段运行起来,起到利用率“填谷”的效果。

具体实施时,需要确保在线服务能在规定的时间内全部被拉起,为此,策略方面我们实现了离线提前退场,并通过调度器抢占机制兜底,确保在线服务在业务高峰期来临之前能被全量及时拉起。

图片

阶段三:常态混部

为了降低资源碎片率,降低业务资源持有成本,平台持续推进业务大规模合池,将业务由独占池迁至平台托管的公共混部池,通过合池,资源超卖等技术手段,CPU 分配率得到有效提升,但依旧无法解决合并后的资源池夜间利用率较低等问题。另一方面,合池后的复杂混部场景下,整机腾挪分时混部离线的调度策略很难再继续实施,平台需要通过建设更为细粒度的资源管理与调度能力来实现均值利用率提升的目标,具体包含以下几点:

  • 调度侧:
    • 通过动态超卖技术获取可二次分配给离线的可用资源量,并抽象出离线资源视图让 K8s 调度器感知到,调度器调度离线负载到对应节点上,实现离线对节点利用率的“填谷”效果;
    • 通过负载调度,尽可能避免在线服务被调度到高负载机器,让集群中节点负载更加均衡;
    • 通过二次调度,驱逐负载热点机器上的高利用率服务,使得集群负载处于动态均衡状态。
  • 单机侧:
    • 支持 Qos(Quality of service) 保障策略,根据服务的 Qos 等级提供差异化的运行时资源保障能力;
    • 支持干扰检测、离线驱逐等能力,当离线对在线敏感服务产生干扰时,第一时间驱逐离线。

通过以上技术手段,可以有效保障服务混部时的稳定性,从而常态化的让在线离线工作负载混跑在节点上,实现利用率填谷效果的最大化。

图片

架构设计与实现

小红书容器资源调度架构设计如图所示:

图片

小红书各类业务场景通过各类发布平台、任务平台提交后,通过上层负载编排能力,以 pod 形式下发到统一调度系统。统一调度系统基于不同的调度需求,对在线服务提供强保障的资源交付能力,差异化的 Qos 保障能力,对离线服务提供最小资源需求的保障能力和极致的弹性能力。

调度侧:

  • 离线调度:coscheduling;
  • 二次调度:热点驱逐,碎片整理;
  • 负载调度:基于 CPU 水位;
  • 资源视图:模拟调度。

单机侧:

  • 压制策略:bvt 压制,内存驱逐;
  • Qos 保障:绑核,超线程干扰抑制等;
  • Batch 资源上报:batch 可用资源计算,上报;
  • 指标采集(from kernel):psi,sched info 等;
  • 干扰检测:基于 cpi,psi,业务指标的干扰检测。

离线调度资源视图

离线服务资源调度的基本原理是基于在线服务负载感知能力的动态超卖,具体实现是将节点空闲资源二次分配给离线业务:

图片

其中离线可用资源为节点上的空闲资源(包含未分配资源和已分配未使用资源之和),扣除安全预留资源之后剩余资源,离线可用资源计算公式如下:

离线可用资源=整机资源–预留资源-在线服务实际使用量

将计算出的离线可用资源量按照时间分布后如图所示(图中绿色部分):

图片

实际落地过程中,为了避免离线可用资源随在线服务资源使用波动而大幅波动,从而影响离线资源质量和离线服务运行稳定性,通过资源画像对上述公式中的在线服务实际使用量数据进一步处理,去除数据噪点,最终计算出一个相对稳定的离线可用资源量(图中绿色部分),如图所示:

图片

混部 QoS 保障策略

QoS 分级

按照业务对于服务质量(QoS: Quality of service)的需求,我们将小红书的业务类型简单的划分为三个 QoS 级别,如下表所示:

Qos等级说明业务场景
latency-sensitive最高Qos保障等级,延迟极为敏感服务搜推广延迟极为敏感场景
mid默认Qos保障等级,容忍部分干扰延迟网关,java微服务
batch最低Qos保障等级,延迟不敏感,资源随时可能被抢转码,spark,flink,训练等计算场景
QoS 保障

根据服务的 QoS 需求,节点侧会做 Pod 粒度的分级资源保障,实现各个资源维度差异化 QoS 保障策略,具体的保障参数如下:

资源特性latency-sensitivemidbatch
CPUcpu burstenableenabledisable
调度优先级最高默认
绑核share(默认)share(默认)reclaimed
numa强保证prefer(默认)none
L3 cache100%100%(默认)30%(默认)
内存带宽100%100%(默认)30%(默认)
内存OOM优先级最低默认最高
内存回收水线调高默认调低

在 CPU 核调度层面,分别设置了三种绑核类型,并设计了一套精细化 CPU 核编排策略,分配示意图如下:

图片

三种绑核类型分别为:

  • exclusive(不推荐)
    • 特点:绑定 cpuset 调度域,CCD 感知,numa 绑定,独占排他
    • 场景:极为敏感的搜推广大规格延迟敏感服务
  • share
    • 特点:绑定 cpuset 调度域,CCD 感知,numa(可选)绑定,share/exlusive 排他,可与 none 类型业务共享
    • 场景:容忍部分干扰的 Java 微服务,应用网关,web 服务
  • reclaimed
    • 特点:无 cpuset 绑定,可能与非 exlusive 绑核模式业务共享核,核的分配完全交由内核,CPU 资源并非 100% 能得到满足
    • 场景:batch 类离线服务,部分对延迟无要求的计算服务
离线驱逐

极端场景下,如整机内存使用率较高,有触发 OOM 风险,或者离线业务 CPU 长期得不到满足,单机侧支持按照离线服务内部定义的优先级配置,资源用量,运行时长等多维度综合算分排序后按序驱逐。

离线业务场景

小红书作为一个数亿用户的内容社区,其离线业务场景丰富多样,其中包含大量视频类,图片类转码场景,搜推,cv/nlp 算法推理训练,算法特征生产,数仓查询等离线场景,具体来讲,包含以下业务类型:

  • 近离线转码场景(已容器化)
  • Flink 流式/批式计算(已容器化)
  • Spark 批式计算 (未容器化,on yarn)
  • cv/nlp 算法回扫场景(已容器化)
  • 训练场景 (已容器化)

通过提供以 K8s 为底座的在离线统一调度能力,将这些离线业务与在线服务混合部署在统一计算资源池内,为在线服务提供差异化的资源质量保障,为离线服务提供海量的低层本算力,实现资源效能的提升。

图片

K8s 与 YARN 混部方案

小红书内部商业化,社区搜索等业务存在大量的算法类 spark 任务因为离线集群资源紧张导致任务堆积,不能得到及时处理,同时在线集群在业务低峰时段资源使用率较低;另一方面,相当占比的 spark 任务资源调度仍旧运行在 Yarn 调度器上,在这样的背景下,为了降低业务迁移成本,方案选型方面,我们选择与 Kooridinator 社区合作,采用 Yarn on K8s 混部方案来快速落地 Spark 离线场景混部,具体方案如图所示:

图片

其中容器化的在线、离线工作负载通过 K8s 链路发布到在线集群内,Spark 作业通过 Yarn ResourceManager 调度到具体节点,并由节点上的 Nodemanager 组件拉起。其中 Nodemanager 通过容器的方式部署在在线 K8s 集群内,除此之外,还涉及到以下组件:

  • 调度侧
    • koord-yarn-operator :支持 K8s 与 yarn 调度器资源视图双向同步;
  • 节点侧
    • copilot:NodeManager 操作代理,提供 Yarn Task 管控接口;
    • Neptune-agent/koordlet:离线资源上报,节点离线 Pod/task 管理,冲突解决,驱逐,压制策略;

支持 K8s 与 YARN 混部的核心能力目前已经在社区研发完成,将于 11 月下旬,在 Koordinator 1.4 版本进行发布。

多调度器资源同步

K8s 调度器与 YARN 调度器之间原本独立且相互不感知,为了共享分配在线集群节点上的总可用离线资源,需要通过 koord-yarn-operator 组件来做两个调度器之间的资源双向同步和协调,并实现两个同步链路:

  1. K8s->YARN 调度器资源同步链路,负责同步 Yarn 视角离线资源总量,其中 YARN 离线资源总量计算如下:

YARN 离线资源总量=离线总可用量-K8s 侧节点已分配

  1. YARN->K8s 调度器资源同步链路,负责同步 YARN 已分配资源量,其中 K8s 离线资源总量计算如下:

K8s 离线资源总量=离线总可用量-YARN 侧节点已分配

基于各自节点离线资源视图,两个调度器分别做出调度决策,调度 K8s 离线 Pod 与 YARN Task 到节点上,由于同步过程不适合加锁,可能会出现资源被过量分配的问题:

图片

具体解决措施是在单机侧增加了仲裁逻辑,当节点已分配离线服务资源量长期超过节点可用离线资源,且离线使用率持续较高,存在离线服务得不到资源被饿死的可能,单机侧则会根据离线服务的优先级,资源占用量,运行时长等因素综合算分并按序驱逐。

阿里云 EMR 产品化支持

图片

与此同时,阿里云 EMR 团队在产品层面提供了混部功能的开发支持,在兼容EMR 原有日志,监控,运维逻辑的基础上,支持了 K8s 集群弹性扩缩容 NodeManager Pod 的能力。

落地收益

截止目前,小红书混部能力覆盖数十万台机器规模,覆盖算力规模数百万核,支持数万规模在线、离线场景服务的资源调度。通过大规模容器混部的持续推进,小红书在资源成本效能等方面都取得了显著收益,具体包含以下两方面:

  • CPU 利用率
    • 在保证在线服务服务质量的前提下,在线混部集群天均 CPU 利用率提升至 45% 以上,部分集群天均 CPU 利用率可稳定提升至 55%。
    • 通过在离线混部等技术手段,在线集群 CPU 利用率提升 8%-15%  不等,部分存储集群 CPU 利用率提升可达 20% 以上。
  • 资源成本
    • 在保证离线业务稳定性的前提下,为小红书各类离线场景提供数百万核时的低成本算力。
    • 混部集群 CPU 分配率提升至 125% 以上,相较于独占资源池,资源碎片率明显下降。

社区共建历程

图片

小红书是早期参与 Koordinator 社区的公司之一,2022 年 4 月,Koordinator 正式开源,同年 6 月,小红书内部启动了在离线混部项目,开始参与 Koordinator 方案设计与代码提交。2022 年 8 月,小红书与社区共建了 runtime-proxy 组件,并在内部场景落地。2023 年 4 月,小红书在社区主导启动了 YARN 与 K8s 混部项目,2023 年 8 月,该方案在小红书内规模化落地。

截止目前,依托 Koorindiator 的助力,小红书的混部已经覆盖公司数万台节点,提供数十万核离线资源,整体混部集群的利用率提升至 45% 以上。 取得了不错的落地效果。

总结与展望

在小红书近一年多混部技术探索过程中,我们在资源效能提升方面积累了较为丰富的落地经验,并取得了不错的提升效果,随着公司业务规模逐步增长,场景愈发复杂,我们将会面临诸多新的技术挑战。下个阶段我们的目标是建设面向混合云架构的统一资源调度能力,具体工作将围绕以下三方面展开:

  1. 混合工作负载调度能力支持: 包括大数据,AI 在内的任务型工作负载调度能力建设,满足小红书所有业务场景的资源调度功能,性能需求;
  2. 资源效能进一步提升: 面向混合云架构,推进更大规模的资源合池,推进 quota 化资源交付,通过更加激进的弹性,混部,超卖等技术手段,实现集群资源利用率的进一步提升,资源成本的大幅下降;
  3. 更高服务质量保障能力: 在更为激进的 CPU 利用率目标背景下,通过建设 Qos 感知调度能力,干扰检测能力,依托安全容器等技术手段,解决深水区混部中可能遇到的各类混部干扰问题。

Koordinator 社区近期规划

再接下来的几个版本中,Koordinator 将在以下几个方面进行重点投入:

  • 调度器性能优化: 支持等价类调度,通过合并 request 相同的 pod,避免 filter、score 等调度过程的重复计算。
  • Network QoS: 网络维度容器服务质量,保障高优先级带宽,设计 request/limit模型,保障最低带宽需求。
  • 大数据负载: 支持 Gang 调度原子抢占,按分组整体抢占 Pod;面向 Hadoop YARN 任务的 QoS 策略适配。
  • 资源干扰检测: 基于底层指标、感知容器资源竞争情况,识别异常 Pod,消除干扰并反馈调度链路。

可以使用钉钉搜索群号:33383887 加入 Koordinator 社区钉钉群

点击此处,即可查看 Koordinator 的详细介绍和使用方法!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/292357.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

layuiadmin新建tabs标签页,点击保存,打开新的标签页并刷新

用的layuiamin前端框架 需求:新增的页面为一个标签页,保存后,需要刷新列表 1、新建customMethod.js文件,自定义自己的方法 layui.define(function (exports) {var $ layui.$var customMethod {// 表单点击保存后,…

解决docker容器内无法连接宿主redis

背景 小程序的发短信服务挂了,随查看日志,该报错日志如下 Error 111 connecting to 127.0.0.1:6379. Connection refused. 6379是监听redis服务的端口,那大概是redis出错了。 首先查看了redis是否正常启动,检查出服务正常。 由于小…

Docker-Compose部署Redis(v7.2)主从模式

文章目录 一、前提准备1. redis配置文件2. 下载redis镜像3. 文件夹结构 二、docker-compose三、主从配置1.主节点配置文件 环境 docker desktop for windows 4.23.0redis 7.2 一、前提准备 1. redis配置文件 因为Redis 7.2 docker镜像里面没有配置文件,所以需要…

推荐Linux和Ubuntu系统中特别有用的几个指令

常用推荐指令 1.在Ubuntu中好多文件或文件夹是不能使用右键删除的,因此知道删除文件或文件夹的rm命令显得尤为重要。 (1)删除文件夹的内容包括文件夹: # 以最高权限删除 sudo rm -rf 文件夹的名字 #(-r 是循环的意思&…

Fast R-CNN

Fast R-CNN算法流程 对比与R-CNN其在第二步时并没有将所有的候选区域进行逐个的CNN特征提取,而是直接将整个图片进行一次CNN特征提取,让后再将候选区映射到feature map上。可想而知速度得到了提升。这里的ROI pooling层缩放到7x7就是将候选区域对应的特征…

MySQL Enterprise版本各系统安装包下载

一、官方下载地址 oracle下载地址 https://edelivery.oracle.com/osdc/faces/SoftwareDelivery 使用oracle账号登录进去 Category选择Download Package(下载安装包),搜索栏输入mysql Enterprise关键字点search进行搜索。选项结果第一个MySQL Enterprise Edition&a…

buuctf-Misc 题目解答分解106-108

106.[DDCTF2018]流量分析 提示了私钥 ,无厘头,先不管了,应该是流量加密了,用wireshark 打开 看看,真个数据流量,没有http 直接找到TCP 协议的包追踪一下TCP 找到TCP 不是红色的包追踪,大量的数…

有人说品酒品的是文化,品红酒的文化是什么?

喝茶有茶文化,品酒有酒文化,云仓酒庄的品牌雷盛红酒LEESON分享那么品红酒的文化是什么呢?一千个人可能喝出一千种不同的文化。但核心只有一个,那就是在葡萄酒里不单单是品出酒味,而要品出品味、品出深度,品…

windows-Qt 获取设备PCIE通道宽度

pcie通道信息获取似乎一般都是在linux环境下,windows方法较少。本次是调用第三方命令行工具,通过windows版的lspci.exe去获取。 lspci.exe资源可从这里下载: https://download.csdn.net/download/bangtanhui/88701726 程序主要需要用到以下这…

MySQL之CRUD、常见函数及union查询

目录 一. CRUD 1.1 什么是crud 1.2 SELECT(查询) 1.3 INSERT(新增) 1.4 UPDATE(修改) 1.5 DELETE(删除) 二. 函数 2.1 常见函数 2.2 流程控制函数 2.3 聚合函数 三. union与union all 3.1 union 3.2 union all 3.3 具体不同 3.4 结论 四. 思维导图 一. CRUD 1.1 什么是crud…

Leetcode算法系列| 11. 盛最多水的容器

目录 1.题目2.题解C# 解法一:暴力C# 解法二:双指针(左指针大于右指针,left)C# 解法三:双指针优化(左指针小于等于最小高度,left)Java 解法一:双指针Python3 解…

【KingbaseES】实现MySql函数Median

本方法只支持在聚合函数窗口中调用 不支持在GROUP BY中使用,使用plsql写的玩意新能都会稍微差一些 建议使用原生方法修改 CREATE OR REPLACE FUNCTION _final_median(numeric[])RETURNS numeric AS $$SELECT AVG(val)FROM (SELECT valFROM unnest($1) valORDER BY …

wy的leetcode刷题记录_Day72

wy的leetcode刷题记录_Day72 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间: 前言 目录 wy的leetcode刷题记录_Day72声明前言2397. 被列覆盖的最多行数题目介绍思路代码收获 1137. 第 N 个泰波那契数题目介绍思路代码收获 2397. 被列覆…

氢燃料电池——产品标准规范汇总和梳理

文章目录 氢燃料电池模块 氢燃料电池发动机 氢燃料电池汽车 加氢系统 总结 氢燃料电池模块 GB/T 33978-2017 道路车辆用质子交换膜燃料电池模块 GB/T 43361-2023 气体分析 道路车辆用质子交换膜燃料电池氢燃料分析方法的确认 GB/T 29729-2022 氢系统安全的基本要求 GB/T 4…

拿到年终奖后马上辞职,厚道吗?

拿到年终奖后马上辞职,厚道吗? 作为一个人,你首先要对自己负责,其次是对自己身边的人(妻儿,家人,朋友)负责。 你明明可以跳槽到有更好的职业发展你不去,是为不智&#…

分布式基础概念

分布式基础概念 1 微服务 微服务架构风格,就像是把一个单独的应用程序开发为一套小服务,每个小服务运行在自己的进程中,并使用轻量级机制通信,通常是HTTP API。这些服务围绕业务能力来构建,并通过完全自动化部署机制…

52、全连接 - 特征与样本空间的对应关系

上一节说到经过全连接层之后,神经网络学习到的特征,会从隐层特征空间逐步映射到样本空间,这主要是由于全连接层可以融合全局的特征。 在经过全连接层之后,在 ResNet50 这个神经网络中会输出1000个特征的得分值,这1000个特征的得分值,便可以对应到图像的分类。 怎么对应…

Unity坦克大战开发全流程——开始场景——排行榜数据逻辑

开始场景——排行榜数据逻辑 排行榜单条数据 排行榜列表 然后在数据管理类中声明一个对应的字段 初始化数据 然后再在上一节课所编写的UpdatePanelInfo函数中处理数据更新的逻辑 时间换算算法 然后再在数据管理类中编写一个在排行榜中添加数据的方法以提供给外部 直到当前RankI…

day8--java高级编程:数据结构与集合源码

数据结构与集合源码 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 本章专题与脉络 1. 数据结构剖析 我们举一个形象的例子来理解数据结构的作用: 战场:程序运行所需的软…