2022互联网寒冬,看看阿里中间件团队如何降本提效?
The following article is from 阿里巴巴中间件 Author 易立
本文根据作者易立在 9 月 20 日由中国计算机学会组织的 CCF TF 会议演讲整理。
背景
Aliware
阿里云容器产品家族
FinOps 与云原生
用法 – 选择合适的算力适配工作负载,比如对高性能计算等场景,选择计算型实例,或者利用 GPU、RDMA 等加速设备实现降本提效。 用量 – 根据工作负载的特征,进行合理的容量规划。 价格 – 选择包年包月、按量付费,采用不同计费方法,在资源的确定性、成本之间进行合理取舍。
Kubernetes 实现基础设施弹性与应用弹性
Aliware
应用水平伸缩面临的挑战与解决之道
弹性的滞后性。弹性伸缩基于对监控指标的被动响应,此外由于应用本身启动、底层资源扩容也需要一定时间。如果当业务高峰到达再扩容,有可能导致业务受损; 配置的复杂性。HPA 的运行效果取决于弹性阈值的配置,配置过于激进可能导致应用稳定性受影响;配置过于保守,成本优化的效果就大打折扣。需要反复尝试才能达到一个合理的水平。而且随着应用的变化,也会需要重新调整弹性策略。
AHPA
Aliware
核心办法
Data Collection 模块负责从数据源收集监控 Metrics 指标并将数据转为统一的格式传入给 Prediction 模块,兼容多种数据源,支持多种扩缩容指标。 Prediction 模块负责根据输入指标预测所需的 Pod 数量。Preprocessing 负责数据预处理,比如处理缺失数据等。完成预处理后将时序数据传递给 RobustScaler 算法进行分析和预测。 Scaling 模块根据 Prediction 给出的结果,对 Pod 数量进行扩缩容。为保证应用平稳运行,其中 ScalingProtection 组件会对算法预测出的 Pod 数量进行修正,采取快速扩容,缓慢缩容的策略。
其中 Forecasting 组件用于时序数据分解。首先利用 RobustPeriod 算法检测数据是否有周期性。如果数据存在周期性,则调用 RobustSTL(Seasonal-Trend Decomposition)算法分解出数据的趋势、周期及残差项;如果数据没有周期性,则调用 RobustTrend 算法分解出趋势和残差项。 ResourceModel 组件用于资源模型构建,该模型的输入为指标的时序数据,输出为 Pod 数量。模型选用了统计学中的排队模型。具体的模型与输入的指标有关,单指标一般采用线性模型,多指标时往往采用非线性模型。 Planning 组件分为 Proactive 及 Reactive 两种模式。Proactive 根据历史指标数据进行主动预测,Reactive 根据实时数据进行被动预测。两种模式的预测结果进行处理后输出最终的扩缩容策略。
实验结果
• 当数据存在周期性时,AHPA 对数据缺失、毛刺以及业务变更引发的数据周期变化等有很强的鲁棒性;
• 当数据不存在周期性时,AHPA 因具备一定的预测能力,可以提前感知数据趋势变化;对数据丢失、噪音等有很强的鲁棒性;
AHPA 基于预测的自动弹性
分布式系统中资源调度的复杂性挑战
Aliware
对多形态异构资源的支持。今天应用所需的计算资源不只是简单的 CPU、内存、存储等,而且包括多样化的加速设备,比如 GPU、RDMA 等。而且,为了考虑到计算效率的最优化,要考虑到计算资源之间的拓扑,比如 CPU core 在 NUMA 节点间的布局,GPU 设备间 NVLink 拓扑等。此外随着高性能网络的的发展、GPU 池化、内存池化等相继出现,给资源调度带来更多的动态性和复杂性。 对多样化的工作负载的支持。从 Stateless 的 Web 应用、微服务应用,到有状态的中间件和数据应用,再到 AI、大数据、HPC 等计算任务类应用,他们对资源申请和使用方式有不同的需求。 对多维度业务需求的支持。调度系统在满足应用对资源需求的同时,也要满足不同的业务需求,比如计算效率、优先级、稳定性、利用率等等。
Koordinator-非侵入扩展 Kubernetes 支持任务混部
差异化 SLO 保障:在 Kubernetes 之上抽象一套面向 QoS 的资源调度机制,比如延迟敏感型的在线类任务,和 Best effort 类型可抢占的计算任务。在提升资源利用率的同时,让低优先级的任务对延迟敏感型任务的影响 < 5%。 QoS 感知调度:包括 CPU、GPU 拓扑感知等精细调度能力,帮助应用优化运行时性能效率,通过资源画像、热点打散等技术增强系统的调度和重调度能力,帮助应用改进运行时稳定性。 任务调度:支持大数据与 AI 相关的任务调度,比如 Gang、批量、优先级抢占以及弹性 Quota(队列间借用)等,从而更好地去弹性使用整个集群资源。
差异化 SLO
Spark 混部效果展示
QoS 感知调度、重调度
在 ACK 中,通过 CPU 拓扑感知调度,在内存密集型任务场景,相比于社区方案有 20%~40%的性能优化,在 AI 分布式训练任务,调度器针可以自动选择最佳多 GPU 卡间互联拓扑,提供最大通信带宽,提升计算效率。对 ResNet、VGG 等典型 CV 类模型训练有 1~3 倍加速。
数据密集型应用在云原生环境上的挑战
Aliware
异构数据源带来的多样性挑战:企业中不同应用所依赖的存储实现各不相同,有 HDFS、NAS、S3/OSS等等;其数据访问的 I/O 特性也不同,比如随机读海量小文件和顺序读大文件。随着业务场景的发展,经常需要联合处理来自不同的存储系统的数据,这样带来了异构数据源访问的复杂性。 存算分离架构导致的 I/O 性能和吞吐的挑战:计算存储分离架构可以大大降低存储成本,并且提升计算弹性。但相应增加了了数据访问延时。这有可能导致计算性能的下降,降低 CPU/GPU 等资源的实际利用率。而随着弹性深度学习等技术的兴起,算力可以根据计算成本或者收敛效率变化而动态扩缩容,进而带来 I/O 容量规划和供给的变化。 跨作业数据共享效率低下的挑战:通过对模型训练集群的观察,我们发现很多训练任务使用同样的数据集。同一作业流水线上的不同步骤也可能需要访问相同的数据。但是由于这些数据重用无法被调度系统感知,导致数据被反复拉取,降低了整体计算效率,也加剧了对数据源 I/O 资源的争抢。
Fluid-数据编排的核心方法
数据集 Dataset,可以实现对异构数据源的统一管理和统一访问抽象。 通过自动缓存扩容和智能预取实现数据加速;还可以根据数据集的访问的模式,来自动优化数据缓存的生命周期策略。 调度系统可以自动感知多任务之间的数据集关联与血缘,基于数据共享优化作业调度。
Fluid-云原生数据编排与加速
零侵入 – 无缝融合 Kubernetes 生态; 可扩展 – 支持多种缓存引擎,比如阿里云 JindoFS、腾讯云 GooseFS、开源的 Alluxio、JuiceFS 等等; 高弹性 – 除了支持经典的 K8s 之外,对 Serverless 容器也进行支持,支持缓存 I/O 吞吐的水平扩展。
Fluid-加速 AI 训练效果
在微博测试场景中,Fluid 针对海量小文件缓存优化,可以大大降低 HDFS 压力,训练速度提升 9 倍。
云原生 FinOps 成本管理,助力企业高效用云
Aliware