阿里云容器服务差异化 SLO 混部技术实践

本文涉及的产品
可观测可视化 Grafana 版,10个用户账号 1个月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
函数计算FC,每月15万CU 3个月
简介: 阿里巴巴在“差异化 SLO 混合部署”上已经有了多年的实践经验,目前已达到业界领先水平。所谓“差异化 SLO”,就是将不同类型的工作负载混合运行在同一节点,充分利用工作负载对资源 SLO 需求特征的不同,提升资源整体使用效率。本文将重点介绍相关技术细节和使用方法,让用户可以充分享受差异化 SLO 带来的技术红利。

作者:佑


背景介绍

阿里巴巴在“差异化 SLO 混合部署”上已经有了多年的实践经验,目前已达到业界领先水平。所谓“差异化 SLO”,就是将不同类型的工作负载混合运行在同一节点,充分利用工作负载对资源 SLO 需求特征的不同,提升资源整体使用效率。本文将重点介绍相关技术细节和使用方法,让用户可以充分享受差异化 SLO 带来的技术红利。


资源模型

作为通用的计算资源托管框架,Kubernetes 托管了多种类型的业务负载,包括在线服务、大数据、实时计算、AI 等等。从业务对资源质量需求来看,这些业务可以分为“延时敏感型”(Latency Sensitive,简称 LS)和“资源消耗型”(Best Effort,简称 BE)两类。


对于 LS 类型,为了确保资源的稳定性(能够应对突发的业务流量,能够应对机房容灾后带来的流量增长),一个可靠的服务通常会申请较大的资源 request 和 limit,这也是 Kubernetes 集群资源分配率很容易做到 80% 以上但利用率却低于 20% 的主要原因,也是 Kubernetes 引入 BestEffort QoS 类型的原因。


1.png

image.gif

为了充分利用这部分已分配但未使用的资源,我们将上图中的红线定义为 usage,蓝色线到红色先预留部分资源定义为 buffered,绿色覆盖部分定义为 reclaimed,如下图所示:


2.png

image.gif

这部分资源代表了可动态超卖的资源量,也就是∑reclaimed(Guaranteed/Burstable)。将这部分空闲资源分配给 BE 类型的业务,就可以充分利用工作负载对资源运行质量需求不同的特征,提升集群整体资源利用率。


阿里云容器服务 Kubernetes 版(Alibaba Cloud Container Service for Kubernetes,以下简称 ACK)差异化 SLO 扩展套件提供了将这部分超卖资源量化的能力,动态计算当前的reclaimed资源量,并以标准扩展资源的形式实时更新到 Kubernetes 的 Node 元信息中。


# Node
status:
  allocatable:
    # milli-core
    alibabacloud.com/reclaimed-cpu: 50000
    # bytes
    alibabacloud.com/reclaimed-memory: 50000
  capacity:
    alibabacloud.com/reclaimed-cpu: 50000
    alibabacloud.com/reclaimed-memory: 100000


低优的 BE 任务在使用 reclaimed 资源时,只需在 Pod 增加“qos”和“reclaimed-resource”的表述即可,其中 qos = LS 对应高优先级,qos = BE 对应低优先级;reclaimed-cpu/memory 为 BE Pod 的具体资源需求量。


# Pod
metadata:
  label:
    alibabacloud.com/qos: BE # {BE, LS}
spec:
  containers:
  - resources:
      limits:
        alibabacloud.com/reclaimed-cpu: 1000
        alibabacloud.com/reclaimed-memory: 2048 
      requests:
        alibabacloud.com/reclaimed-cpu: 1000
        alibabacloud.com/reclaimed-memory: 2048


技术内幕


CPU 资源质量


CPU Burst


Kubernetes 为容器资源管理提供了 Limit(约束)的语义描述,对于 CPU 这类分时复用型的资源,当容器指定了 CPU Limit,操作系统会按照一定的时间周期约束资源使用。例如对于 CPU Limit = 2 的容器,操作系统内核会限制容器在每 100 ms 周期内最多使用 200 ms 的 CPU 时间片。


下图展示了一台 4 核节点、某 CPU Limit = 2 的 Web 服务类容器,在收到请求(req)后各线程(Thread)的 CPU 资源分配情况。可以看出,即使容器在最近 1s 内整体的 CPU 利用率较低,受 CPU Throttled 机制的影响,Thread 2 仍需要等待下一个周期才能继续将 req 2 处理完成,进而导致请求的响应时延(RT)变大,这通常就是容器 RT 长尾现象严重的原因之一。


3.png


CPU Burst 机制可以有效解决延迟敏感性应用的 RT 长尾问题,允许容器在空闲时积累一些 CPU 时间片,用于满足突发时的资源需求,提升容器性能表现,目前阿里云容器服务 ACK 已经完成了对 CPU Burst 机制的全面支持。对于尚未支持 CPU Burst 策略的内核版本,ACK 也会通过类似的原理,监测容器 CPU Throttle 状态,并动态调节容器的 CPU Limit,实现与内核 CPU Burst 策略类似的效果。


4.png

CPU 拓扑感知调度


随着宿主机硬件性能的提升,单节点的容器部署密度进一步提升,进程间的 CPU 争用,跨 NUMA 访存等问题也逐渐加剧,严重影响了应用性能表现。在多核节点下,进程在运行过程中经常会被迁移到其不同的核心,考虑到有些应用的性能对 CPU 上下文切换比较敏感,kubelet 提供了 static 策略,允许 Guarantee 类型 Pod 独占 CPU 核心。但该策略尚有以下不足之处:


  • static policy 只支持 QoS 为 Guarantee 的 Pod,其他 QoS 类型的 Pod 无法使用。


  • 策略对节点内所有 Pod 全部生效,而 CPU 绑核并不是”银弹“,需要支持 Pod 粒度的精细化策略。


  • 中心调度并不感知节点实际的 CPU 分配情况,无法在集群范围内选择到最优组合。


阿里云容器服务 ACK 基于 Scheduling framework 实现了拓扑感知调度以及灵活的绑核策略,针对 CPU 敏感型的工作负载可以提供更好的性能。ACK 拓扑感知调度可以适配所有 QoS 类型,并支持在 Pod 维度按需开启,同时可以在全集群范围内选择节点和 CPU 拓扑的最优组合。


弹性资源限制(reclaimed-resource)


如资源模型中的描述,节点 reclaimed-resource 的资源总量会跟随高优先级容器实际的资源用量动态变化,在节点侧,为了保障 LS 容器的运行质量,BE 容器实际可用 CPU 数量同样受 LS 容器负载的影响。


5.png

image.gif

如上图所示,当 LS 容器资源用量上涨时,受负载水位红线的限制,BE 容器可用的 CPU 数量相应减少,在系统层面会体现在容器 cgroup 分组的 CPU 绑定范围,以及 CPU 时间片的分配限制。


内核Group Identity


Alibaba Cloud Linux 2 从内核版本 kernel-4.19.91-24.al7 开始支持 Group Identity 功能,通过为容器设置不同的身份标识,可以区分容器中进程任务的优先级。内核在调度不同优先级的任务时有以下特点:


  • 高优先级任务的唤醒延迟最小化。


  • 低优先级任务不对高优先级任务造成性能影响。主要体现在:


  • 低优先级任务的唤醒不会对高优先级任务造成性能影响。

  • 低优先级任务不会通过 SMT 调度器共享硬件 unit(超线程场景)而对高优先级任务造成性能影响。


6.png

image.gif

Group Identity 功能可以对每一个容器设置身份标识,以区分容器中的任务优先级。Group Identity 核心是双红黑树设计,在 CFS(Completely Fair Scheduler)调度队列的单红黑树基础上,新增了一颗低优先级的红黑树,用于存放低优先级任务。


系统内核在调度包含具有身份标识的任务时,会根据不同的优先级做相应处理。具体说明如下表:

7.png


更多关于内核 Group Identity 能力的详细描述,可参见官网文档:https://help.aliyun.com/document_detail/338407.html


LLC 及 MBA 隔离


在神龙裸金属节点环境,容器可用的 CPU 缓存(Last Level Cache,LLC)及 内存带宽(Memory Bandwidth Allocation,MBA)可以被动态调整。通过对 BE 容器进程的细粒度资源限制,可以进一步避免对 LS 容器产生性能干扰。


内存资源质量

全局最低水位线分级


在 Linux 内核中,全局内存回收对系统性能影响很大。特别是时延敏感型业务(LS)和资源消耗型(BE)任务共同部署时,资源消耗型任务时常会瞬间申请大量的内存,使得系统的空闲内存触及全局最低水位线(global wmark_min),引发系统所有任务进入直接内存回收的慢速路径,进而导致延敏感型业务的性能抖动。在此场景下,无论是全局 kswapd 后台回收还是 memcg 后台回收,都将无法处理该问题。


8.png

image.gif

基于上述场景下的问题,Alibaba Cloud Linux 2 新增了 memcg 全局最低水位线分级功能。在 global wmark_min 的基础上,将 BE 的 global wmark_min 上移,使其提前进入直接内存回收。将 LS 的 global wmark_min 下移,使其尽量避免直接内存回收。这样当 BE 任务瞬间申请大量内存的时候,会通过上移的global wmark_min 将其短时间抑制,避免 LS 发生直接内存回收。等待全局 kswapd 回收一定量的内存后,再解除 BE 任务的短时间抑制。


更多关于内核全局内存最低水位线分级能力的详细描述,可参见官网文档:https://help.aliyun.com/document_detail/169537.htm


后台异步回收


在全局最低水位线分级后,LS 容器的内存资源不会被全局内存回收影响,但当容器内部紧张时会触发直接内存回收,直接内存回收是发生在内存分配上下文的同步回收,因此会影响当前容器中运行进程的性能。


为了解决这个问题,Alibaba Cloud Linux 2 增加了容器粒度的后台异步回收功能。该功能的实现不同于全局 kswapd 内核线程的实现,并没有创建对应的 memcg kswapd 内核线程,而是采用了 workqueue 机制来实现,并在 cgroup v1 和 cgroup v2 两个接口中,均新增了控制接口(memory.wmark_ratio)。


9.png


当容器内存使用超过 memory.wmark_ratio 时,内核将自动启用异步内存回收机制,提前于直接内存回收,改善服务的运行质量。


更多关于容器内存后台异步回收能力的描述,可参见官网文档:https://help.aliyun.com/document_detail/169535.html


基于单机资源水位的驱逐

CPU 资源满足度


前文介绍了多种针对低优先级离线容器的 CPU 资源压制能力,可以有效保障 LS 类型业务的资源使用。然而在 CPU 被持续压制的情况下,BE 任务自身的性能也会受到影响,将其驱逐重调度到其他空闲节点反而可以使任务更快完成。此外,若 BE 任务在受压制时持有了内核全局锁这类资源,CPU 持续无法满足可能会导致优先级反转,影响 LS 应用的性能。


因此,差异化 SLO 套件提供了基于 CPU 资源满足度的驱逐能力,当 BE 类型容器的资源满足度持续低于一定水位时,使用 reclaimed 资源的容器会按从低到高的优先级被依次驱逐。


内存阈值水位


对于混部场景的内存资源,即便可以通过多种手段促使内核提前回收 page cache,优先保障 LS 容器的资源需求。但在内存资源超卖情况下,依然存在整机 RSS 内存用满导致 OOM 的风险。ACK 差异化 SLO 套件提供了基于内存阈值的驱逐能力,当整机 Memory 使用率水位超过阈值时,按优先级依次对容器进行 kill 驱逐,避免触发整机 OOM,影响高优容器的正常运行。


案例实践

使用 CPU Brust 提升应用性能


我们使用 Apache HTTP Server 作为延迟敏感型在线应用,通过模拟请求流量,评估 CPU Burst 能力对响应时间(RT)的提升效果。以下数据分别展示了 Alibaba Cloud Linux 2、CentOS 7 在 CPU Burst 策略开启前后的表现情况:


10.png11.png

比以上数据可得知:


  • 在开启 CPU Burst 能力后,应用的 RT 指标的 p99 分位值得到了明显的优化。


  • 对比 CPU Throttled 及利用率指标,可以看到开启 CPU Burst 能力后,CPU Throttled 情况得到了消除,同时 Pod 整体利用率基本保持不变。


通过应用混部提升集群利用率

我们以“Web服务+大数据”场景为例,选择了 nginx 作为 Web 服务(LS),与 spark benchmark 应用(BE)混部在 ACK 集群的同一节点,介绍 ACK 差异化 SLO 套件在实际场景下的混部效果。


12.png


对比非混部场景下的基线,以及差异化 SLO 混部场景下的数据,可以看出 ACK 差异化 SLO 套件可以在保障在线应用服务质量的同时(性能干扰 < 5%),提升集群利用率(30%)


  • 对比“nginx 独立运行”与“差异化 SLO 混部”的 nginx 时延数据,RT-p99 只有4.4%左右的性能下降。


  • 对比“spark 独立运行”与“差异化 SLO 混部”的 BE 任务运行时长,即便在 BE 任务频繁受到压制的情况下,总运行时间只上升了 11.6%。


13.png


大数据集群提升资源利用率


相较于延时敏感型的在线服务,大数据类型应用对资源质量的要求并不敏感,“差异化 SLO 混部”可以进一步提升大数据集群的容器部署密度,提高集群资源利用率,缩短作业平均运行时间。我们以 Spark  TPC-DS 评测集为例,介绍 ACK 差异化 SLO 套件对集群资源利用率的提升效果。


以下数据展示了“差异化 SLO”功能在开启前后,各项数据指标的对比情况:


  • “差异化 SLO”功能开启后,通过集群 reclaimed-resource 资源超卖模型,集群内可以运行更多的 Spark 容器。


  • 集群 CPU 平均利用率由 49% 提升至 58%;资源的充分利用使得评测集作业的总运行时间下降了 8%。


14.pngimage.gif


总结


阿里云容器服务 ACK 支持差异化 SLO 的相关功能将在官网陆续发布,各项功能可独立用于保障应用的服务质量,也可在混部场景下共同使用。实践表明,差异化 SLO 技术可以有效提升应用性能表现。特别是在混部场景下,ACK 差异化 SLO 混部技术可以将集群资源利用率提升至相当可观的水平;同时,针对在线时延敏感型服务,该技术可以将混部引入的性能干扰控制在 5% 以内。


点击此处,即可查看阿里云容器服务 ACK 支持差异化 SLO 各项功能的详细介绍!

相关实践学习
使用ACS算力快速搭建生成式会话应用
阿里云容器计算服务 ACS(Container Compute Service)以Kubernetes为使用界面,采用Serverless形态提供弹性的算力资源,使您轻松高效运行容器应用。本文将指导您如何通过ACS控制台及ACS集群证书在ACS集群中快速部署并公开一个容器化生成式AI会话应用,并监控应用的运行情况。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
2月前
|
存储 Kubernetes 网络安全
关于阿里云 Kubernetes 容器服务(ACK)添加镜像仓库的快速说明
本文介绍了在中国大陆地区因网络限制无法正常拉取 Docker 镜像的解决方案。作者所在的阿里云 Kubernetes 集群使用的是较旧版本的 containerd(1.2x),且无法直接通过 SSH 修改节点配置,因此采用了一种无需更改 Kubernetes 配置文件的方法。通过为 `docker.io` 添加 containerd 的镜像源,并使用脚本自动修改 containerd 配置文件中的路径错误(将错误的 `cert.d` 改为 `certs.d`),最终实现了通过多个镜像站点拉取镜像。作者还提供了一个可重复运行的脚本,用于动态配置镜像源。虽然该方案能缓解镜像拉取问题,
355 2
|
4月前
|
Cloud Native 中间件 调度
云原生信息提取系统:容器化流程与CI/CD集成实践
本文介绍如何通过工程化手段解决数据提取任务中的稳定性与部署难题。结合 Scrapy、Docker、代理中间件与 CI/CD 工具,构建可自动运行、持续迭代的云原生信息提取系统,实现结构化数据采集与标准化交付。
169 1
云原生信息提取系统:容器化流程与CI/CD集成实践
|
8月前
|
Ubuntu 关系型数据库 MySQL
容器技术实践:在Ubuntu上使用Docker安装MySQL的步骤。
通过以上的操作,你已经步入了Docker和MySQL的世界,享受了容器技术给你带来的便利。这个旅程中你可能会遇到各种挑战,但是只要你沿着我们划定的路线行进,你就一定可以达到目的地。这就是Ubuntu、Docker和MySQL的灵魂所在,它们为你开辟了一条通往新探索的道路,带你亲身感受到了技术的力量。欢迎在Ubuntu的广阔大海中探索,用Docker技术引领你的航行,随时准备感受新技术带来的震撼和乐趣。
365 16
|
8月前
|
安全 持续交付 云计算
课时5:阿里云容器服务:最原生的集成Docker和云服务
阿里云容器服务以服务化形式构建容器基础设施,大幅提升开发效率,简化应用部署流程。通过Docker容器和DevOps工具(如Jenkins),实现自动化部署与迭代,优化企业内部复杂部署问题。该服务支持GPU调度、混合云架构无缝迁移,并与阿里云产品体系无缝集成,提供安全防护、网络负载均衡等多重功能支持。凭借微服务架构,帮助企业突破业务瓶颈,提高资源利用率,轻松应对海量流量。
313 0
课时5:阿里云容器服务:最原生的集成Docker和云服务
|
8月前
|
人工智能 Kubernetes Serverless
阿里云向全球客户推出创新容器计算服务ACS,可降低算力成本高达55%
阿里云向全球客户推出创新容器计算服务ACS,可降低算力成本高达55%
|
9月前
|
弹性计算 监控 持续交付
面对热点事件,阿里云如何通过云上弹性与容器服务帮助客户应对流量洪峰
面对热点事件,阿里云如何通过云上弹性与容器服务帮助客户应对流量洪峰
233 0
|
9月前
|
监控 Cloud Native Java
基于阿里云容器服务(ACK)的微服务架构设计与实践
本文介绍如何利用阿里云容器服务Kubernetes版(ACK)构建高可用、可扩展的微服务架构。通过电商平台案例,展示基于Java(Spring Boot)、Docker、Nacos等技术的开发、容器化、部署流程,涵盖服务注册、API网关、监控日志及性能优化实践,帮助企业实现云原生转型。
|
3月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
793 108

相关产品

  • 容器计算服务
  • 容器服务Kubernetes版