CPU 使用优先级

最近更新时间:2024-10-29 15:56:52

我的收藏

功能介绍

部署服务过程中,通常会将一类业务进程部署到某台服务器上,服务器的 CPU 利用率取决于业务进程的压力情况,一般情况下,服务器的整体 CPU 利用率往往比较低。为了提高服务器 CPU 的利用率,可以在服务器上混合部署一些优先级较低的任务,这样可以显著提高整机的 CPU 利用率,降低硬件成本。这里定义混部到机器上的优先级较低的任务称之为“离线任务”或是“低优先级任务”。
混合部署解决了 CPU 利用率低的问题,但是会导致混布任务之间的 CPU 争抢,从而使得原先的重要业务指标(运行时长,延迟等)受到影响。为了解决这个问题,CPU QoS 引入了绝对抢占机制,允许重要业务进程在可运行的时候无条件抢占不重要业务进程,保证在提高整机 CPU 利用率的同时,重要业务进程不受影响。

基本原理

用户可以通过给任务/容器设定不同的优先级,来指定内核对任务/容器的调度行为。例如优先级为0的容器和优先级为7的容器同时运行在同一个 CPU 上时,优先级为0的容器只要可以运行,总是会无条件抢占优先级为7的容器,直至高优先级容器进程运行完成或是阻塞休眠,低优先级容器中的进程才会被调度执行。
QoS Agent 支持用户设置8个不同级别(0-7)的优先级,优先级为0-6之间的容器则不存在绝对抢占的关系,按照 CPU 的使用比例进行资源的划分和限流。两个业务,一个优先级设置成0,另一个设置成6,之间不会因为优先级划分资源。划分资源只是在节点资源发生竞争时,不同的 Pod 按照 Request 的资源申请量进行比例划分,详情可参见 文档。将一些离线作业优先级设置为7,在提高机器利用率的同时,保证高优和延迟敏感的在线业务不受离线业务的影响。
不同优先级之间 CPU QoS 行为如下:




使用方式

1. 部署 QoS Agent
2. 在集群里的组件管理页面,找到部署成功的 QoS Agent,单击右侧的更新配置
3. 在修改 QoS Agent 的组件配置页面,勾选 CPU 使用优先级
4. 单击完成
5. 部署离线业务。
6. 部署关联离线业务的 PodQOS 对象,选择需要降低优先级的业务,示例如下:
apiVersion: ensurance.crane.io/v1alpha1
kind: PodQOS
metadata:
name: low
spec:
labelSelector:
matchLabels:
k8s-app: low # 选择需要降低优先级的业务的 Label
resourceQOS:
cpuQOS:
cpuPriority: 7 # 将指定业务的 cpuPriority 设置为7,7表示优先级最低,发生资源竞争时会被优先抢占