计算资源优化

更新时间:

基于云基础设施的操作系统优化

阿里云提供了Alibaba Cloud Linux操作系统镜像,是阿里云基于龙蜥社区(OpenAnolis)的龙蜥操作系统(Anolis OS)打造的操作系统发行版,在兼容RHEL/CentOS生态的同时,为云上应用程序提供安全、稳定、高性能的定制化运行环境,并针对云基础设施进行了深度优化,打造更好的云上操作系统体验。与阿里云基础设施深度结合优化,持续提升系统的启动速度、运行时的性能。同时经过海量阿里巴巴和阿里云的产品打磨,提供优良的稳定性体验。在如下方面提供了特性优化:

  • 内核方面:Alibaba Cloud Linux2基于Linux kernel 4.19 LTS定制而成;Alibaba Cloud Linux 3基于Linux kernel 5.10 LTS定制而成。系统在持续增加适用于云场景的新特性的同时,持续改进内核性能并修复重大缺陷,并且提供针对ECS实例环境定制优化的内核启动参数和系统配置参数

  • 开机启动速度:针对ECS实例环境大幅优化启动速度,在实际测试中,相比其他操作系统约减少60%的启动时间。

  • 运行时的系统性能:优化调度、内存以及IO等子系统,在部分的开源基准测试中,相比其他操作系统约提升10%~30%性能。

针对特定业务场景性能优化的 ECS 实例规格族选项

基于不同场景的需求,云服务器 ECS(Elastic Compute Service)为用户提供了多种选择。产品序列包含通用计算、异构计算、高性能计算三大类,支持包括各类垂直场景增强型实例,比如网络增强型、存储增强型、内存增强型、安全增强型、大数据型、高主频型、异构计算实例等,提供高性价比产品。对于特定的高性能场景,用户可以根据业务场景来选择,典型的如下几类:

  • 弹性裸金属服务器 EBM(ECS Bare Metal Instance):基于阿里云完全自主研发的下一代虚拟化技术而打造的新型计算类服务器产品,兼具虚拟机的弹性和物理机的性能及功能特性。与上一代虚拟化技术相比,下一代虚拟化技术不仅保留了普通云服务器的弹性体验,而且保留了物理机的性能与特性,全面支持嵌套虚拟化技术。弹性裸金属服务器融合了物理机与云服务器的优势,实现超强超稳的计算能力。通过阿里云自主研发的虚拟化2.0技术,业务应用可以直接访问弹性裸金属服务器的处理器和内存,无任何虚拟化开销。弹性裸金属服务器具备物理机级别的完整处理器特性(例如Intel VT-x),以及物理机级别的资源隔离优势,特别适合上云部署传统非虚拟化场景的应用。

  • GPU 云服务器 EGS(Elastic GPU Service):GPU云服务器是基于GPU与CPU应用的计算服务器。GPU在执行复杂的数学和几何计算方面有着独特的优势,特别是在浮点运算、并行运算等方面,GPU可以提供上百倍于CPU的计算能力。GPU的功能特性如下:拥有大量擅长处理大规模并发计算的算术逻辑单元(Arithmetic and Logic Unit,即ALU) 、能够支持多线程并行的高吞吐量运算、逻辑控制单元相对简单。适用于视频转码、图片渲染、AI训练、AI推理、云端图形工作站等场景。

  • 超级计算集群 SCC(Super Computing Cluster):在弹性裸金属服务器基础上,加入高速RDMA(Remote Direct Memory Access)互联支持,大幅提升网络性能,提高大规模集群加速比。因此SCC在提供高带宽、低延迟优质网络的同时,还具备弹性裸金属服务器的所有优点。SCC主要用于高性能计算和人工智能、机器学习、科学计算、工程计算、数据分析、音视频处理等场景。在集群内,各节点间通过RDMA网络互联,提供高带宽低延迟网络,保证了高性能计算和人工智能、机器学习等应用的高度并行需求。同时,RoCE(RDMA over Convergent Ethernet)网络速度达到InfiniBand网络级的性能,且能支持更广泛的基于Ethernet的应用。

合理利用弹性资源

云上计算类产品提供灵活的弹性功能和策略,对无规律的业务量波动和有规律的业务量波动性能要求都能完成较好的适配。弹性资源的类型主要包括如下几类:

弹性伸缩

弹性伸缩 ESS(Auto Scaling)是指根据业务需求和策略自动调整计算能力(即实例数量)的服务。可以指定实例的类型为ECS实例或ECI实例。弹性伸缩作为云上广泛应用的功能提供多种伸缩模式,包括固定数量模式、健康模式、定时模式、自定义模式和动态模式等,同时通过生命周期挂钩和冷却时间等特性给用户提供充分的灵活性。

容器弹性伸缩

弹性是容器服务 Kubernetes 版 ACK(Container Service for Kubernetes)被广泛采用的功能,典型的场景包含在线业务弹性、大规模计算训练、深度学习GPU或共享GPU的训练与推理、定时周期性负载变化等。弹性伸缩分为两个维度:

  • 调度层弹性,主要是负责修改负载的调度容量变化。包括HPA、VPA、CronHPA和Elastic-Workload等类型,例如HPA是典型的调度层弹性组件,通过HPA可以调整应用的副本数,调整的副本数会改变当前负载占用的调度容量,从而实现调度层的伸缩。

  • 资源层弹性,主要是集群的容量规划不能满足集群调度容量时,会通过弹出ECS或ECI等资源的方式进行调度容量的补充。包括cluster-autoscaler、virtual-node和virtual-kubelet-autoscaler等类型。

在实际应用当中,建议两者有机结合,同时,在高性能场景下,对容器的弹出速度提出了更高的要求。针对调度层弹性,可以通过ack-autoscaling-placeholder组件为集群的自动扩展提供缓冲区。针对资源层弹性,可以适用Alicloud Image Builder自动化构建镜像,再结合ACK集群节点池的自定义镜像功能,快速地扩容节点。

函数计算

函数计算 FC(Function Compute)默认集成了弹性的属性,按量模式根据函数的调用量自动进行实例扩缩容,在调用增加时创建实例,在请求减少后销毁实例。整个过程中,通过请求自动触发实例创建。如果实例在一段时间内不处理请求,会自动销毁。按量模式降低了管理应用资源的难度,但也造成了冷启动,延时等性能问题。

冷启动是指在函数调用链路中的代码下载、启动函数实例容器、运行时初始化、代码初始化等环节。当冷启动完成后,函数实例就绪,后续请求就能直接被执行。在追求高性能的场景下,往往需要相应的解决方案消除冷启动延时的影响。

冷启动的优化用户和平台配合完成。函数计算已经对系统侧的冷启动做了大量优化。对于用户侧的冷启动,建议您从以下几方面优化:

  • 精简代码包:开发者要尽量缩小代码包。去掉不必要的依赖。例如,在Node.js中执行npm prune命令,在Python中执行autoflake 。另外,某些第三方库中可能会包含测试用例源代码,无用的二进制文件和数据文件等,删除无用文件可以降低函数代码下载和解压时间。

  • 选择合适的函数语言:由于语言理念的差异,Java运行时冷启动时间通常要高于其他语言。对于冷启动延迟敏感的应用,在热启动延迟差别不大的情况下,使用Python轻量语言可以大幅降低长尾延迟。

  • 选择合适的内存:在并发量一定的情况下,函数内存越大,分配的CPU资源相应越多,因此冷启动表现越优。

  • 降低冷启动概率

    • 使用定时触发器预热函数。

    • 使用Initializer回调,函数计算会异步调用初始化接口,消除掉代码初始化的时间,在函数计算系统升级或者函数更新过程中,您对冷启动无感知。

在实际应用过程中,用户侧的冷启动一般难以消除。例如,在深度学习推理中,要加载大量的模型文件时;函数要和遗留系统交互,必须使用初始化耗时很长的客户端时。在这些场景下,如果函数对延时非常敏感,您可以为函数设置预留模式实例,或者在同一个函数里同时使用预留模式实例和按量模式实例。

预留模式实例的分配和释放由您管理,根据实例的运行时长计费。当负载对资源的需求超过预留模式实例的能力后,系统自动使用按量模式实例,从而在性能和资源利用率上获得平衡。通过预留模式实例,您能够根据函数的负载变化提前分配好计算资源,系统能够在扩容按量模式实例时仍然使用预留模式实例处理请求,从而彻底消除冷启动带来的延时。