admin管理员组

文章数量:1659751

本文介绍爱奇艺针对视频生产场景、在 Kubernetes(以下简称 K8s) 集群优化方面的实践:如何使高优先级任务获得更多的 CPU 资源,更快完成任务。

01

   背景

视频生产集群所面临的一个挑战是 K8s 原生机制无法区分业务优先级。视频生产任务拥有不同的业务优先级和资源需求,业务优先级是根据视频节目的重要程度及上线时间的紧迫程度进行区分的,重点节目相关的任务优先级高,上线时间紧迫的任务优先级高,其他节目的优先级低。

资源需求是从任务类型维度区分,如超清视频任务需要 8 CPU,普通视频任务需要 4 CPU。因此存在低优先级任务和高优先级任务申请相同数量 CPU 的情况,例如高优先级超清视频任务和低优先级超清视频任务都申请 8 CPU。

K8s 原生机制并不感知业务优先级,在上述情况下会给两者分配同样多的 CPU 资源。用户期望高优先级任务可以抢占低优先级任务的 CPU 资源,从而更快执行。

业界也提出了类似于业务优先级的概念,如文章 [1] 中提出的应用优先级,但是并未给出具体的解决方案。本文介绍了一种允许高优先级任务抢占低优先级任务 CPU 资源,加速高优先级任务执行的方案。该方案不仅可以在提交任务时指定优先级,还可以对执行过程中的任务进行优先级调整,满足视频生产效率要求。

02

   原理概述

为了给高优先级任务提供更多的 CPU 资源,我们在集群中每个物理节点上运行一个代理服务进程,该代理进程会区分节点上任务的优先级,将高优先级任务对应的 Cgroups cpu 子系统中控制 CPU 使用量的值调高,从而允许高优先级任务可以抢占低优先级任务的 CPU 资源,使其更快地执行。这个方案依赖于 K8s 集群中各个节点关闭 CPU 限流,从而使高优先级任务可以自由抢占低优先级任务的 CPU 资源,不会受到 CPU 限流的影响。

03

   高优先级任务 CPU 抢占

  1、前提:关闭节点 CPU 限流  

在 K8s 中,任务以 Pod 形式存在,其 CPU 资源分配和使用受到 Pod 元数据中两个字段控制:CPU Resource Requests 和 CPU Resource Limits,Pod 可使用的 CPU 总量介于两者之间。CPU Resource Requests 为 Pod 提供了最少 CPU 保证,该字段的值会写入到 Pod 对应的 Cgroups cpu 子系统 cpu.shares 文件中,通过 cpu.shares 保证 Pod 使用的资源量。CPU Resource Limits 为 Pod 提供 CPU 使用上限,它的值对应到 Cgroups cpu 子系统的 cpu.cfs_quota_us 和 cpu.cfs_period_us 文件,具体对应关系请参考文章 [2]。

为了解除 CPU Resource Limits 对 Pod 的 CPU 限流,我们在视频生产 K8s 集群中通过 kubelet 的配置项 '--cpu-cfs-quota=false' 关闭了 CPU CFS Quota,允许高优先级 Pod 自由抢占低优先级 Pod 的 CPU 资

本文标签: 优先级集群业务视频爱奇艺