B站容器平台混部和容量管理实践 B站资深开发/许龙 大纲 •各类混部场景的实践方案 •CPU在离线混部:在线+转码、在线+大数据 •CPU潮汐混部:推搜+大数据 •GPU常态混部:推理+转码 •GPU潮汐混部:推理+训练 •容量管理的实践方案 •弹性伸缩:VPA和HPA •合池:quota管理、算力标准化 •容量运营与可视化 B站容器平台架构 •CPU核数:百万级 •除部分大数据、中间件外全部容器化 在线业务 主站直播广告电商…视频转码 离线业务 AI训练大数据… 平台层 业务层 发布平台机器学习平台边缘计算平台批处理平台 容器引擎层 资源调度 容量管理 混部框架集群管理 容器运行时 k8s组件CNI/CSI 镜像仓库 自建IDC 服务器 网络 存储 公有云 云主机 云专线 云存储 基础设施层 混部实践方案 CPU在离线混部 •在线+视频转码 •在线+大数据 CPU潮汐混部 •推搜+大数据 GPU混部 •推理+编解码 •推理+训练 CPU在离线混部的难点 调度 •混部任务尽量不占用在线任务的可用配额(cpu/memoryrequest) •调度器需要动态感知节点的可混部资源量 •满足离线任务的E2E调度性能 QoS保障 •在线任务的性能不被离线任务干扰:精细化隔离措施(cpu/内存/磁盘/网络…) •离线任务也需要一定的性能保障:区分混部资源质量 批任务处理平台 在线发布平台 CPU在离线混部的架构 任务下发模块 •在线任务通过容器发布平台下发 •离线任务通过批处理任务平台下发 master onlinepod offlinecolocationpod kube-scheduler 调度模块 •在线任务采用原生调度器 •离线任务采用volcano调度器 •离线任务基于k8s扩展资源进行调度 混部agent模块 •混部算力的动态计算和上报 kube-apiserverwebhook cluster k8snodek8snodek8snode volcano K8snode onlinepod extendedresourceoffline pod prometheus colocationconfigmanager •资源隔离 •监控数据上报 配置管理模块 •不同节点组的混部策略管控 colocation-agent CPU在离线混部-资源上报 混部资源上报 •基于在线负载,动态计算可混部资源 •采用k8sdevice-plugin机制,上报混部扩展资源、 •通过本机指标采集计算,去除外部监控链路依赖 •资源分级,结合资源池画像,区分高低优混部资源 NodeAllocatable: caster.io/colocation-stable-cpu:10 caster.io/colocation-free-cpu:5 Updatenodeinfo api-server 高优资源:资源比较稳定,离线任务可较长期稳定运行 低优资源:资源比较波动,离线任务容易受到压制或驱逐 kubeletColocationagent DevicePlugin DeviceManager registerresource computeresource 在线离线 k8snode CPU在离线混部-调度方案 视频转码场景的挑战 •计算规模庞大:日均千万级任务 •计算资源异构:CPU/GPU/混部/混合云 •系统压力大:并发高,E2E拉起速度要求高 批任务调度模块 批任务调度模块 Job-manager 视频转码业务方 服务网关 Job-managerJob-manager •对混部业务方提供统一的openAPI •多集群调度:支持资源余量、优先级等策略 •单集群调度:采用volcano调度器+自定义plugin •高可用:无单点可扩展、支持限流 •支持多租户 单集群调度性能优化 •etcd:分离event、使用nvme等 •apiserver/controller调大限速 •镜像p2p下载 •Volcano深度优化:例如job到pod的创建延迟优化 上报资源预留、任务状态等信息 Scheduler(slave) apiservervolcanoagent Scheduler(master) apiservervolcanoagent Scheduler(slave) Otherclusters cluster1cluster2 CPU在离线混部-资源隔离 /sys/fs/cgroup kubepods 混部大框 •根据在线负载动态计算可混部资源量 •根据可混部资源量调整大框cgroup besteffort podxxx混部大框 Podxxx(guaranteed) burstable podxxx 混部大框16C/48G 混部大框32C/100G 混部大框8C/16G 在线负载降低,混部动态调大 NodeNode 在线负载升高,混部动态调小 Node CPU在离线混部-资源隔离 CPU隔离 •混部大框:最小cpushare、动态扩缩 •第一阶段:混部绑核(考虑HT) •第二阶段:内核层cpu调度优先级 CPU在离线混部-资源隔离 内存隔离 •混部大框:动态扩缩 •第一阶段:调节oom_score_adj •第二阶段:内核层oom优先级;memcgpagecache异步回收 网络隔离 •离线转码任务采用bridge网络,使用host-localip •基于TC进行混部pod的网络带宽限速 驱逐避让 •针对内存、磁盘等不可压缩资源,达到阈值后触发混部任务驱逐 •驱逐冷却 memory.limitmemory.wmark_high rss pagecache memory.wmark_low CPU在离线混部-资源隔离 内核隔离参数设置方式 •基于runtimeproxy •容器创建时,通过hook设置内核参数,时效性更高 •后续考虑切到containerd的NRI方式 CPU在离线混部-大数据混部场景 yarn(resourcemanager) 申请资源 AM YarnNMonk8s •YarnNM作为daemonset部署到k8snode •混部agent动态上报资源给NM中的agent •Yarn技术优化: •支持remoteshuffle •基于应用画像调度中小规格任务 •跨机房网络带宽限速 启动MR/sparktask NMpodAmiyasidecar 混部资源上报 colocationagentpod 资源上报/超配 NMpodAmiyasidecar 混部资源上报 colocationagentpod 基于在线负载计算混部资源 onlinepod 基于在线负载计算混部资源 onlinepod K8SnodeK8Snode k8smaster CPU在离线混部-全场景管理 混部资源供给 •容器化机器默认开启混部 •未容器化的业务,物理机利用率非常低,推动业务方将机器纳管到k8s跑混部 •备机池闲置机器,自动接入k8s跑混部 混部资源使用方 混部调度系统 视频转码spark/flinkbatchhadoop AI处理 混部资源使用(多租户) •推动视频转码、大数据、AI等多种业务场景接入混部 •高优混部资源: •资源相对稳定 •跑高优混部任务,租户粒度设置固定quota •低优混部资源 •资源较为波动 •跑低优混部任务,租户粒度按比例分配quota 混部管理平台 •策略管理 •节点组、策略类型、水位控制等 •监控大盘 •各粒度资源上报量、分配量、使用量等 •节点侧故障分析指标,内核层指标 混部资源供给方 k8s 容器化机器 混部策略管理 混部可观测 备机非容器机器(redis、kafka、db、……) 混部实践方案 CPU在离线混部 •在线+视频转码 •在线+大数据 CPU潮汐混部 •推搜+大数据 GPU混部 •推理+编解码 •推理+训练 CPU潮汐混部 在线:1000台 在线:1300台 在线:1000台 场景:推搜+大数据 •推搜: 实例规格大,延时非常敏感,较难接受直接在离线直接混部 凌晨使用资源少,白天使用资源多 •大数据: 能容忍一定程度的排队以及任务延迟 凌晨资源使用多,白天资源使用少 07:30 在线回收机器完成 大数据:1000台 08:00 大数据拆借给在线 大数据:700台 01:00 大数据回收机器 大数据:1000台 正向潮汐 01:30 在线反向供给大数据 在线:900台 大数据:1100台 07:00 在线开始逐步扩容,回收机器 在线:700台 大数据:1300台 05:00 在线缩容到最低 在线:900台 大数据:1100台 反向潮汐 CPU潮汐混部-正向潮汐 •自研clusterautoscaling组件 基于自定义k8scrd+controller 支持多种扩缩策略 支持多种资源供给方 •独立潮汐应用,cronHPA定时扩缩,保障机器按时拆借、归还 •基于机型的wrr负载均衡,解决机型差异问题 •SLO巡检告警 CPU潮汐混部-反向潮汐 •在线业务基于利用率进行HPA扩缩 •潮汐应用HPA缩容后如何尽量缩出整机,避免驱逐大规格实例? 尽量将潮汐应用调度到同一节点 在凌晨HPA缩容前,通过算法挑选出最适合缩容的实例 ,并打上delete-cost值 •混部过程中,实时检测在线实例创建并驱逐nodemanger 混部实践方案 CPU在离线混部 •在线+视频转码 •在线+大数据 CPU潮汐混部 •推搜+大数据 GPU混部 •推理+编解码 •推理+训练 GPU混部-vGPU调度 GPU共享调度 •卡切分粒度:1%算力、256MiB显存 •调度特性: 支持卡类型调度 支持多卡调度 支持显存调度(单卡跑多任务场景) 支持坏卡隔离 支持binpack,减少卡碎片 GPU混部-vGPU隔离 GPU隔离 •业界隔离方案 MPS、MIG CUDA劫持 内核劫持 •方案选择 基于开源驱动的内核隔离 GPU混部-vGPU隔离 GPU内核隔离实现原理 •用户通过cgroup接口配置一个组(应用)可用 Nvidia开源内核驱动自研BGM模块 gpu-manger 的显存和时间片 获取显存信息 显存限制api 设置GPU隔离参数 •在显存隔离上,驱动里获取显存信息时,通过BGM模块获取第1步配置的显存limit,保证其不会用超上限 •在算力隔离上,在驱动里配置TSG的API里 ,通过BGM模块获取第1步配置的slice覆盖默认的2ms。 nvidia.ko 设置时间片 单卡调度周期 时间片限制api 获取GPU隔离配置 cgroup •APP申请0.3卡,则timeslice设置为:0.3*单卡调度周期 APP1APP2……APP1APP2 GPU混部-编解码场景 GPU推理+转码 •部分显卡比如NVIDIAT4/A10有独立的编码器和解码器 •推理服务不使用编解码器,编解码利用率0 •视频编解码任务主要使用编解码器 GPU混部-编解码场景 GPU推理+转码 •通过GPU-manager组件上报编解码资源 •单卡预留固定大小显存给编解码任务 •cuda没有干扰,只需要显存隔离 GPU混部-潮汐场景 在线任务HPA •服务配置基于GPU利用率的HPA •白天扩容,凌晨缩容 离线任务调度 •批任务调度平台感知空闲卡数变化 •离线任务通过平台调度到对应集群 批任务调度平台 在线任务发布平台 apiserverK8s-scheduler HPA-controller 缩容扩容 任务退避 •潮汐时间结束,离线任务主动退避 •在线HPA扩容,调度器基于优先级主动驱逐抢占离线任 Deployment/rc 在线pod在线pod在线pod Deployment/rc 在线pod在线pod在线pod 务离线pod离线pod 离线pod 在线pod在线pod 在线pod 在线pod抢占离线pod 容量管理