您当前的位置:首页 > 电脑百科 > 程序开发 > 容器

既要稳也要省,容器资源该怎么分配?

时间:2023-10-24 15:49:18  来源:微信公众号  作者:滴滴技术

众所周知,假期出行,热情高涨,需求增多也使得稳定性保障压力大。当各个服务流量激增时,资源负载压力将会显著提升。微观上,单台物理机的 CPU 利用率会大幅提升,单机上各个容器之间的争抢会增加,性能受到影响。宏观上,整个弹性云的热点机器会增加,可供调度的资源会降低,容器调度和扩容的失败率会上升。

今年,在降本增效的大前提下,不额外增加计算型服务器采购,如何保障资源供给以及确保高压场景下的容器稳定性,对弹性云而言是个巨大的挑战。为了提供更稳定的容器服务,弹性云全面梳理了容器服务资源保障的每一个环节,提出了新分级保障体系,提供了明确的容器资源保障等级,在此基础上,针对不同优先级的容器提供相应的资源和稳定性保障。

早期弹性云容器体系带来的超卖隐患

弹性云早期分级体系提供了1/2/3级容器等级,只是对容器的优先级进行了简单的区分,并未将容器优先级与底层的资源保障关联在一起。容器服务在使用过程中,会遇到以下问题:

  • 资源争抢严重
  • 业务延迟较高,毛刺较多
  • 扩容失败概率较高
  • 业务容量评估不准
  • 物理机数量难以评估

之所以会存在这些问题,实际上还是因为在资源层面没有相应的保障。从单机资源看,部分物理机的 CPU 使用率峰值过高,并且容器的 CPU 资源存在不同程度的超卖。

从集群资源来看,旧体系下 quota 与物理机资源缺乏关联,导致业务申请的 quota 仅仅停留在数字层面,不指导物理机资源的准备。此外,quota 还缺乏管控,导致 quota 的申请与实际需求严重脱节。

既要稳也要省,容器资源该怎么分配?

造成上述诸多问题很重要的一个原因就是弹性云资源整体上是超卖的,且比较严重。

所谓的资源超卖,指的是资源的申请量>供给量,表现为单机 & 集群方面均超卖。

  • 单机层面,一台物理机上运行的所有容器的规格相加大于物理机所能提供的资源总量。
  • 集群层面,服务资源的 quota 总和大于集群物理机资源总量。 既要稳也要省,容器资源该怎么分配?

从上图中可以看到,单是1级服务申请的资源量,就已经超过了物理机的总资源量。在集群和单机都超卖的情况下,早期的分级体系并没有确立明确的超卖规则,使得旧体系容器运行环境整体处于无序和不确定的状态下。

两大超卖解决思路带来的四大收益

思路一:核心服务链路不超卖

所有的核心服务链路上的服务均1:1对应物理机资源,不超卖。通过对机房1和机房2进行简单的统计, 发现核心服务链路中网约车+两轮车+代驾服务的申请量总和占据了所有服务总申请量的大约一半,且机房1核心服务的申请量已经超过总CPU数,机房2核心服务的申请量基本接近总CPU数。所以,核心服务不超卖受限于资源,方式不可行。      

既要稳也要省,容器资源该怎么分配?     

思路二:核心服务链路中最重要的服务不超卖

受限于资源,无法做到所有的核心服务链路中的服务都不超卖,那退一步,在物理资源有限的情况下,保障核心服务链路中最重要的服务不超卖,并在此基础上,对于剩余的服务制定合理的超卖规则。

因此,弹性云需要重新制定分级保障体系,同时为新分级体系制定明确的超卖规则。超卖规则如下:

  • 核心服务中20% -> S级服务:不超卖
  • 老1级 -> A级服务:2倍超卖
  • 老2/3级 -> B级服务:4倍超卖

既要稳也要省,容器资源该怎么分配?

在新的超卖规则下,可以看到,机房1和机房2的总物理CPU量是基本能满足需求的(机房2的资源申请量略微超出, 可以通过新增机器或是缩容来满足要求)。

这样的重新设计下,我们在2022年元旦前完成所有S级服务的接入,2022年国庆前完成网约车核心服务/两轮车核心服务/代驾核心服务接入新体系。总体来看,这样的改变带来了四大收益:

  • 收益1:资源层面,S级服务CPU外部争抢降低60% ~80%,A级服务CPU外部争抢降低30~50%。
  • 收益2:业务延迟方面,业务99分位延迟(均值)降低7% ~ 20%业务99分位延迟(最大值)降低5% ~ 15%。
  • 收益3:容量方面,高峰期S级服务比之前多承载30%+流量,S级服务比之前能缩容30%+资源。
  • 收益4:业务收益角度,高峰期CPU外部争抢下降65%~75%,毛刺基本消失,业务延迟指标下降5%~25%,业务压测CPU外部争抢下降60%~70%。

弹性云新分级保障体系总体架构

为了支持新分级保障体系,弹性云从下到上,针对每一层中的相关组件都进行开发改造,同时也包含了系统部 CMP 系统quota相关的开发工作,主要体现在操作系统层、k8s 调度层、kube-odin 层、服务树和系统部 CMP 系统。

既要稳也要省,容器资源该怎么分配?

从上述架构图中可以看到,位于最底层的是机房的物理机资源,物理机分别位于不同的机房。

操作系统层

物理机之上是操作系统层,操作系统层面分为内核态和用户态。在内核态新增特性上,新分级体系对 CPU 调度,内存管理,IO 读写都进行了针对性的开发和优化。

CPU 调度:

  • 新增优先级权重概念,不同优先级容器的调度权重不同,用于区分不同等级容器调度优先级。
  • 新增 CPU Burst 技术,允许部分重要容器能短时间内突破规格的上线,临时使用超量的 CPU。

内存管理:

  • 新增优先级回收技术,优先回收低优先级容器的内存,最后回收高优先级容器内存。
  • 新增分级水位特性,减少系统内存紧张时高优先级容器内存分配受阻。

IO 读写:

  • 新增带宽限速特性,支持对低优先级容器的 IO 读写带宽进行限速,以减少对高优先级容器的影响。
  • 新增优先级带宽分配特性,支持按容器优先级分配 IO 带宽。

在用户态新增特性上,操作系统用户态针对新分级体系的支持主要体现在 Kubelet、IRMAS 和单机资源调度这几个组件上。其中,kubelet 和 IRMAS 主要新增了新分级体系容器的识别、信息采集上报、单机资源配置、环境适配等工作。新增单机资源调度模块实现了极端情况下单机资源的压制和恢复,以及与 k8s 调度联动等功能。

k8s 调度层

在 k8s 容器调度层,针对新分级体系新增了最小资源保障策略,指的是通过合理的调度,保障任何时候,容器均能获得承诺的资源量。

容器分级均衡打散策略指的是保证一台物理机上不会存在过多同一级别的容器,将不同等级的容器均匀打散到不同的物理机上。

分级容量资源大盘指的是资源大盘新增新分级体系容器支持,实时观察新分级容器容量健康情况。

扩容成功率保障指的是新增容量预估特性,优化资源申请流程,实时监控弹性云可供扩容资源量,有效提高扩容成功率。

kube-odin 层

kube-odin 层配合新分级体系也进行了相关改动和升级:

  • 新增新等级接入平台:包括新等级容器查询操作相关接口的适配。
  • 计费管理模块:新增新分级体系容器的计费支持,支持多种计费场景。
  • 服务 quota 操作:新增 quota 操作接口。

服务树

服务树在保持兼容性的基础上,新增了新分级体系集群信息的支持。

系统部 CMP 系统

新体系容器的 quota 申请和使用由系统部 CMP 系统操作和记录。

CMP 系统通过获取业务申请的 quota 信息,能明确推算所需的物理机资源,更好实现物理机资源的保障。针对新体系容器的 quota 支持,CMP 系统新增了 quota 成本账户、quota 成本账户以及 quota 申请模块。

  • quota 成本账户:包含S级/A级/B级的 quota 信息。
  • quota 管控模块:对 quota 的使用量进行追踪和考察,以便进行有效的资源管控。
  • quota 申请模块:规范 quota 申请流程,明确 quota 申请规则。

新分级体系三大重点资源保障

新分级体系立足于核心问题,在单机层面和集群层面都对容器申请的资源进行相应保障。

单机资源保障:CPU

新分级体系资源保障的其中一个重点为:保障容器的 CPU 资源任何时刻都能按超卖比所规定的有效交付。

在前文中,我们提到新体系容器的超卖规则为:S级不超卖,A级2倍超卖,B级4倍超卖。那对于不同等级的容器,可轻松得知其所需的物理 CPU 个数。新分级体系所需要保证的就是一台物理机上所有容器经过超卖比计算后得到的物理 CPU 个数必须小于物理机上的 CPU 个数。

既要稳也要省,容器资源该怎么分配?图片

上述的示例中,对于一个40核的物理机,可用的 CPU 数为: 40*90%=36核 (90%为计算各种 agent 和调度损耗之后的有效核数)。容器总共申请的核数为56核,经过超卖比计算后得到的所需物理核为36,刚好满足要求。

通过明确超卖比,根据超卖比准备对应物理 CPU 资源的方式,在高负载期间,如果所有的容器都满载运行,则物理机上的 CPU 资源将会按照超卖比承诺的比例进行分配。在低负载时刻,算力足够时,由于机器整体空闲,容器之间几乎不发生争抢,此时容器可以正常使用 CPU。

单机资源保障:内存

在物理机层面,内存是所有容器之间共享的资源,传统内核没有对容器进行优先级的划分,所有容器的内存使用对于内核而言都是一视同仁。

内存对容器性能的影响主要体现在内存分配和内存回收上。

内存分级水位

既要稳也要省,容器资源该怎么分配?

操作系统内核会监控整个系统的内存使用情况,当可用内存低于一定水位时,就会阻塞内存分配路径,触发内存回收操作。

某些场景下,低优先级容器可能大量申请内存,导致内存水位线降职 min 水位以下,物理机面临内存分配和回收时,高优容器将会受到影响,无法及时的分配内存。

针对这个场景,内核新增了内存分级水位特性,允许按照优先级设置不同的 min 水位。这样,在申请内存时,低优先级容器会先达到回收水位线触发低优先级容器的内存回收,而高优先级容器的内存回收水位线较低,可以正常分配。

内存按优先级回收

由于原生内存没有对内存进行优先级区分,因此当内核走到内存回收路径,会无差别的进行内存回收动作。此时,可能高优先级容器的内存被回收,而低优先级容器内存则完好无损。

新分级体系的目标显然是要在回收内存的时候优先回收低优先级容器的内存,这样可以最大程度保护高优先级容器的内存,进而保障高优先级容器的性能表现。 

既要稳也要省,容器资源该怎么分配?图片

基于优先级回收的思想,内核所做的就是识别容器优先级,然后按照容器优先级逐一回收内存,直至内存水位线恢复健康水平。

既要稳也要省,容器资源该怎么分配?先回收B级容器的内存

既要稳也要省,容器资源该怎么分配?再回收A级容器的内存

既要稳也要省,容器资源该怎么分配?

 

集群资源保障:quota

业务在申请容器服务的时候,一般需要指定单个容器的规格(CPU/内存大小)和申请的数量。汇总服务总共所需的资源量,即为 quota,quota 管理的最小单位为成本账户。

既要稳也要省,容器资源该怎么分配?图片

可以看到,在新分级体系下,quota 按照容器优先级,分为了对应的S级/A级/B级 quota。quota 是用于描述业务的资源申请量,而对于弹性云和系统部而言, 则可以根据 quota,进行物理资源的准备。例如对于某个成本账户,申请的 quota 如下所示:  

既要稳也要省,容器资源该怎么分配?图片

我们可以清楚看到,业务申请的 quota 量与实际准备物理机资源量之间的对应关系。

通过建立并规范 quota 的申请和使用流程,新分级体系能根据资源超卖规则有效的将 quota 的申请量与后台真实物理资源的准备量结合起来,从而实现资源层面的强保障。另外,在 quota 体系逐步完善之后,还能根据 quota 使用率和容器的 CPU 使用率对 quota 进行有效的资源管控。

总结

很长一段时间,旧的弹性云分级体系存在资源争抢、业务延迟、扩容失败、业务无法准确评估容量、物理机数量难以评估等问题。这些问题的本质是由于没有制定明确的资源准备和分配规则。

新分级体系立足于核心问题,提出了明确的资源超卖规则,在单机层面和集群层面都对容器申请的资源进行相应保障。在单机层面,保证了按超卖比转化后实际的物理机资源不会超过物理机所提供的最大资源量,同时制定了明确的资源争抢规则。在集群层面,建立并规范了 quota 申请流程,明确了 quota 与物理机资源之间的对应关系,保障了资源的供给,同时,也有效管控了 quota ,避免资源的浪费。

通过在容器资源申请、容器调度、运行时保障、资源管控等多个方面添加资源保障策略,弹性云新分级体系支持容器高效稳定的运行,确保了弹性云整体的稳定性,也一定程度降低了物理机运营成本。



Tags:容器   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
掌握Docker网络驱动程序:优化容器通信
Docker为在容器内包装、交付和运行应用程序提供了一个强大的平台,从而彻底改变了容器化。网络是容器化的重要组成部分,Docker提供了各种网络驱动程序来支持容器之间的通信以...【详细内容】
2024-03-22  Search: 容器  点击:(10)  评论:(0)  加入收藏
Containerd容器管理
Nginx 指定容器名称 使用 ctr container create 命令创建容器后,容器并没有处于运行状态,其只是一个静态的容器。容器基本操作容器基本操作主要是 ctr image 命令,查看命令帮...【详细内容】
2024-03-20  Search: 容器  点击:(13)  评论:(0)  加入收藏
我们一起聊聊容器资源自愈
在企业实际在使用容器这类资源的时候,除了技术本身,要考虑的其他问题也会很多。企业管理的容器有千千万万,出于效率考虑,对于有特殊需求的容器如何进行批量创建和管理呢,这就需要...【详细内容】
2024-01-30  Search: 容器  点击:(47)  评论:(0)  加入收藏
Docker镜像与容器的交互及在容器内部执行代码的原理与实践
Docker作为一种流行的容器技术,已经成为现代应用程序开发和部署的重要工具。在Docker中,镜像是构建和运行容器的基础,而容器则是基于镜像创建的可执行实例。Docker镜像与容器的...【详细内容】
2024-01-10  Search: 容器  点击:(76)  评论:(0)  加入收藏
Go微服务入门到容器化实践
Go微服务入门到容器化实践Go 是一门高效、现代化、快速增长的编程语言,非常适合构建 Web 应用程序。而 Docker 是一种轻量级的容器化技术,能够使得您的应用程序在任何地方运行...【详细内容】
2024-01-01  Search: 容器  点击:(62)  评论:(0)  加入收藏
容器的“边缘”
译者 | 布加迪审校 | 重楼近年来边缘计算和容器越来越受欢迎,为我们日常生活中与数据处理相关的各种挑战提供了创新的解决方案。这些技术现在已经渗入到各种设备中,包括我们的...【详细内容】
2023-12-25  Search: 容器  点击:(161)  评论:(0)  加入收藏
Docker容器如何打包应用程序的代码和依赖项?
Docker容器通过将应用程序的代码和所有依赖项打包到一个独立的软件包中,实现了应用程序的快速部署和移植。下面是Docker容器实现这一目标的步骤:打包应用程序:使用Docker工具将...【详细内容】
2023-12-20  Search: 容器  点击:(130)  评论:(0)  加入收藏
理解Go、容器以及Linux调度器
Go开发的应用程序通常部署在容器中。在容器中运行时,重要的一点是要设置CPU限制以确保容器不会耗光主机上的所有CPU。但Go运行时不知道容器上设置的CPU限制,因此有可能会把所...【详细内容】
2023-12-18  Search: 容器  点击:(121)  评论:(0)  加入收藏
Docker容器编排技术解析
一、容器编排介绍容器编排是现代云原生应用管理的核心,它涉及在大规模的环境中自动化部署、管理、扩展和网络配置容器。随着微服务架构的兴起和应用的复杂性增加,容器编排成为...【详细内容】
2023-12-15  Search: 容器  点击:(245)  评论:(0)  加入收藏
在Linux系统中实现容器化的大规模数据分析平台:Hadoop和Spark
在Linux系统中实现容器化的大规模数据分析平台,我们可以利用Hadoop和Spark这两个强大的开源工具。Hadoop是一个分布式计算框架,适用于处理大规模数据集。它提供了分布式文件系...【详细内容】
2023-12-15  Search: 容器  点击:(154)  评论:(0)  加入收藏
▌简易百科推荐
Docker 和传统虚拟机有什么区别?
我有一个程序员朋友,他每年情人节都要送女朋友一台服务器。他说:“谁不想在过节当天收到一台 4核8g 的服务器呢?”“万一对方不要,我还能留着自己用。” 给他一次过节的机会,他能...【详细内容】
2024-03-26  小白debug  微信公众号  Tags:Docker   点击:(12)  评论:(0)  加入收藏
掌握Docker网络驱动程序:优化容器通信
Docker为在容器内包装、交付和运行应用程序提供了一个强大的平台,从而彻底改变了容器化。网络是容器化的重要组成部分,Docker提供了各种网络驱动程序来支持容器之间的通信以...【详细内容】
2024-03-22    51CTO  Tags:Docker   点击:(10)  评论:(0)  加入收藏
Containerd容器管理
Nginx 指定容器名称 使用 ctr container create 命令创建容器后,容器并没有处于运行状态,其只是一个静态的容器。容器基本操作容器基本操作主要是 ctr image 命令,查看命令帮...【详细内容】
2024-03-20  云原生运维圈  微信公众号  Tags:容器   点击:(13)  评论:(0)  加入收藏
如何基于Docker镜像逆向生成Dockerfile
引言你是否曾经遇到过一个想要使用的 Docker 镜像,但却无法修改以适应你的特定需求?或者你可能发现了一个喜欢的 Docker 镜像,但想要了解它是如何构建的?在这两种情况下,将 Docke...【详细内容】
2024-03-07  云原生运维圈  微信公众号  Tags:Docker   点击:(22)  评论:(0)  加入收藏
Kubernetes是什么?主要特点是什么?
Kubernetes是什么?Kubernetes,也称为K8s,是一个开源的容器编排系统,由Google首次开发和维护。它允许容器化的应用程序在集群中自动部署、扩展和管理。Kubernetes提供了一种容器...【详细内容】
2024-02-01    简易百科  Tags:Kubernetes   点击:(153)  评论:(0)  加入收藏
我们一起聊聊容器资源自愈
在企业实际在使用容器这类资源的时候,除了技术本身,要考虑的其他问题也会很多。企业管理的容器有千千万万,出于效率考虑,对于有特殊需求的容器如何进行批量创建和管理呢,这就需要...【详细内容】
2024-01-30  匠心独运维妙维效  微信公众号  Tags:容器   点击:(47)  评论:(0)  加入收藏
Docker与Docker Compose入门:释放你应用部署的威力
今天给大家介绍一项强大而有趣的技能,那就是使用 Docker 和 Docker Compose 来释放你的应用部署的威力!无论你是一名开发人员还是系统管理员,掌握这个技能都将为你的工作带来巨...【详细内容】
2024-01-17  waynblog  微信公众号  Tags:Docker   点击:(65)  评论:(0)  加入收藏
Docker镜像与容器的交互及在容器内部执行代码的原理与实践
Docker作为一种流行的容器技术,已经成为现代应用程序开发和部署的重要工具。在Docker中,镜像是构建和运行容器的基础,而容器则是基于镜像创建的可执行实例。Docker镜像与容器的...【详细内容】
2024-01-10  编程技术汇  今日头条  Tags:Docker   点击:(76)  评论:(0)  加入收藏
如何在 Ubuntu 上安装 Docker
使用 Docker 意味着开启一个新的计算领域,但如果你刚刚开始使用 Docker,安装可能看起来是一项艰巨的任务。在 Ubuntu 上安装 Docker 有两种推荐的方法: 从 Ubuntu 的仓库安装 D...【详细内容】
2024-01-04    Linux中国  Tags:Docker   点击:(124)  评论:(0)  加入收藏
从Kubernetes的探针到DevOps
今天在群里又看有人问如何设置 Kubernetes 的探针,感觉要补充的话太多了,结合我们在一些 DevOps 项目中痛苦的体验,今天一劳永逸的全部说完,此外,也为大家展现一下为什么 DevOps...【详细内容】
2023-12-27  云云众生s  微信公众号  Tags:Kubernetes   点击:(114)  评论:(0)  加入收藏
站内最新
站内热门
站内头条