【最不佳实践】Serverless应用优化四则

本文涉及的产品
函数计算FC,每月15万CU 3个月
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: Serverless架构下,虽让我们更多精力是关注我们的业务代码,但是实际上对于一些配置和成本也是需要进行关注的,并且在必要的时候,还需要根据配置与成本进行对我们的Serverless应用进行配置优化和代码优化。

Serverless架构下,虽让我们更多精力是关注我们的业务代码,但是实际上对于一些配置和成本也是需要进行关注的,并且在必要的时候,还需要根据配置与成本进行对我们的Serverless应用进行配置优化和代码优化。

资源评估依旧重要

Serverless架构虽然是按量付费的,但是并不代表他就一定比传统的服务器租用费用低,如果我们对自己的项目评估不准确,对一些指标设置不合理,Serverless架构所产生的费用可能是巨大的。

一般情况下FaaS平台的收费是和三个指标具有直接关系的:所配置的内存规格、程序所消耗的时间以及产生的流量费用。通常情况下程序所消耗的时间可能会与内存规格、程序本身所处理的业务逻辑有关,流量费用与程序本身和客户端交互的数据包大小有关,所以在这三个常见的指标准,可能因为配置不规范导致计费出现比较大偏差的就是内存规格,以阿里云函数计算为例,我们假设有一个Hello World的程序,每天都会被执行10000次,可以统计不同规格的实例所产生的费用(不包括网络费用):

image

通过上表可以看到,当我们的程序在128M规格的内存中可以正常执行,如果我们错误将内存规格设置成了3072MB时,可能每月产生的费用将会暴涨25倍!所以在我们进行Serverless应用上线之前,我们要对资源进行一定的评估,以便得到更合理的配置,来进一步降低我们的成本!

合理的代码包规格

在各个云厂商的FaaS平台中,都有着对代码包大小的限制,抛掉云厂商对代码包的限制,就单纯的说代码包的规格可能会产生什么影响,通过函数的冷启动流程可以看到:

image

在函数启动的过程中,有一个过程是加载代码的过程,那么当我们所上传的代码包过大,或者说文件过多导致解压速度过慢,就会直接导致加载代码这个过程变长,进一步直接导致冷启动时间变久。

可以设想一下,当我们有两个压缩包,一个是只有100KB的代码压缩包,另一个是200MB的代码压缩包,两者同时在千兆的内网带宽下理想化(即不考虑磁盘的存储速度等)下载,即使最大速度可以达到125MB/S,那么前者的下载速度只有不到0.01秒,后者需要1.6秒,除了下载时间之外,还有文件的解压时间,那么两者的冷启动时间可能就相差2秒。一般情况下,一个传统的Web接口,如果要2秒以上的响应时间,实际上对很多业务来说是不能接受的,所以在我们打包代码时就要尽可能的降低压缩包大小。以Node.js项目为例,打包代码包时,可以采用Webpack等方法,来压缩依赖包大小,进一步降低整体代码包的规格,提升函数的冷启动效率。

合理利用实例的复用

在各个云厂商的FaaS平台中,为了更好的解决冷启动的问题,为了更合理的利用资源,是存在“实例”复用情况的。所谓的实例复用,就是当一个实例完成一个请求,他并不会释放,而是进入一个“静默”的状态,在一定时间范围内,如果有新的请求被分配过来,则会直接调用对应的方法,而不需要再初始化各类资源等,这个过程很大程度上降低了函数冷启动的情况出现。为了验证,我们可以创建两个函数:

函数1:

# -*- coding: utf-8 -*-

def handler(event, context):
  print("Test")
  return 'hello world'

函数2:

# -*- coding: utf-8 -*-

print("Test")

def handler(event, context):
  return 'hello world'

我们在控制台多次点击测试按钮,对这两个函数进行测试,判断其是否在日志中输出了“Test”,我们可以统计结果:

image

根据上面的情况,我们可以看到,其实实例复用的情况是存在的,因为函数2并不是每次都会执行入口函数之外的一些语句。根据函数1和函数2,我们也可以进一步思考,如果print("Test")语句是一个初始化数据库连接,或者是加载一个深度学习的模型,是不是函数1的写法就是每次请求都会执行,而函数2的写法是可以存在复用已有对象的情况?

所以在实际的项目中,有一些初始化操作,是可以按照函数2来进行实现的,例如:

  • 机器学习场景下,在初始化的时候加载模型,避免每次函数被触发都会加载模型带来的效率问题,提高实例复用场景下的响应效率;
  • 数据库等链接操作,可以在初始化的时候进行链接对象的建立,避免每次请求都创建链接对象;
  • 其他一些需要首次加载时下载文件,加载文件的场景,在初始化的时候进行这部分需求的实现,可以在实例复用的时候效率更高;

善于利用函数特性

各个云厂商的FaaS平台都有一些“平台特性”,所谓的平台特性就是说这些功能可能并不是《CNCF WG-Serverless Whitepaper v1.0》中规定的能力,或者描述的能力,仅仅是作为云平台根据自身业务发展和诉求,从用户角度出发挖掘出来,并且实现的功能,可能只在某个云平台或者某几个云平台所拥有的功能,这类功能一般情况下如果利用得当会让我们的业务性能等有质的提升。

Pre-freeze & Pre-stop

以阿里云函数计算为例,在平台发展过程中,挖掘出用户痛点(尤其是都碍传统应用平滑迁移至Serverless架构):

  • 异步背景指标数据延迟或丢失:如果在请求期间没有发送成功,则可能被延迟至下一次请求,或者数据点被丢弃。
  • 同步发送指标增加延迟:如果在每个请求结束后都调用类似Flush接口,不仅增加了每个请求的延迟,对于后端服务也产生了不必要的压力。
  • 函数优雅下线:实例关闭时应用有清理连接,关闭进程,上报状态等需求。在函数计算中实例下线时机开发者无法掌握,也缺少Webhook通知函数实例下线事件。

根据这些痛点发布了运行时扩展(runtime extensions)功能。该功能在现有的HTTP服务编程模型上扩展,在已有的HTTP服务器的模型中增加了PreFreeze和PreStop webhooks。扩展开发者实现HTTP handler,监听函数实例生命周期事件

image

PreFreeze:在每次函数计算服务决定冷冻当前函数实例前,函数计算服务会调用HTTP GET /pre-freeze路径,扩展开发者负责实现相应逻辑以确保完成实例冷冻前的必要操作,例如等待指标发送成功等。函数调用InvokeFunction的时间不包PreFreeze hook的执行时间。

image

PreStop:在每次函数计算决定停止当前函数实例前,函数计算服务会调用HTTP GET /pre-stop路径,扩展开发者负责实现相应逻辑以确保完成实例释放前的必要操作,如关闭数据库链接,以及上报、更新状态等。

image

单实例多并发

众所周知,各个厂商的函数计算通常是请求级别的隔离,即当客户端同时发起三个请求到函数计算,理论上会产生三个实例来进行应对,这个时候可能会涉及到冷启动问题,可能会涉及到请求之间状态关联问题等,但是部分云厂商提供了单实例多并发的能力(例如阿里云函数计算),该能力允许用户为函数设置一个实例并发度(InstanceConcurrency),即单个函数实例可以同时处理多少个请求。

如图下图,假设同时有3个请求需要处理,当实例并发度设置为1时,函数计算需要创建3个实例来处理这3个请求,每个实例分别处理1个请求;当实例并发度设置为10时(即1个实例可以同时处理10个请求),函数计算只需要创建1个实例就能处理这3个请求。

单实例多并发的优势:

  • 减少执行时长,节省费用。例如,偏I/O的函数可以在一个实例内并发处理,减少实例数从而减少总的执行时长。
  • 请求之间可以共享状态。多个请求可以在一个实例内共用数据库连接池,从而减少和数据库之间的连接数。
  • 降低冷启动概率。由于多个请求可以在一个实例内处理,创建新实例的次数会变少,冷启动概率降低。
  • 减少占用VPC IP在相同负载下,单实例多并发可以降低总的实例数,从而减少VPC IP的占用。

单实例多并发的应用场景时比较广泛的,例如函数中有较多时间在等待下游服务的响应的场景就比较适合使用该种功能,但是单实例多并发也并不适合全部应用场景,例如当函数中有共享状态且不能并发访问的场景,单个请求的执行要消耗大量CPU及内存资源的场景,就不适合使用单实例多并发这个功能。

image

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
1天前
|
负载均衡 Serverless 持续交付
云端问道9期实践教学-省心省钱的云上Serverless高可用架构
详细介绍了云上Serverless高可用架构的一键部署流程
26 10
|
14天前
|
人工智能 Serverless API
尽享红利,Serverless构建企业AI应用方案与实践
本次课程由阿里云云原生架构师计缘分享,主题为“尽享红利,Serverless构建企业AI应用方案与实践”。课程分为四个部分:1) Serverless技术价值,介绍其发展趋势及优势;2) Serverless函数计算与AI的结合,探讨两者融合的应用场景;3) Serverless函数计算AIGC应用方案,展示具体的技术实现和客户案例;4) 业务初期如何降低使用门槛,提供新用户权益和免费资源。通过这些内容,帮助企业和开发者快速构建高效、低成本的AI应用。
58 12
|
23天前
|
Serverless 开发工具 开发者
活动实践 | 西游再现,函数计算一键部署 Flux 超写实文生图模型部署
这些图片展示了阿里巴巴云开发者生态的多个方面,包括开发工具、技术文档、社区交流、培训认证等内容,旨在为开发者提供全方位的支持和服务。
|
23天前
|
存储 弹性计算 关系型数据库
活动实践 | 告别资源瓶颈,函数计算驱动多媒体文件处理测评
本方案介绍了一种高效处理文件的方法,适用于企业办公和社交媒体应用。通过阿里云的函数计算、对象存储OSS和轻量消息队列,实现文件的异步处理,如格式转换和水印添加,有效减轻了核心应用的负担,提高了业务稳定性和资源利用率。方案包括云服务器ECS、云数据库RDS、OSS存储等组件,支持快速部署和资源清理。
|
2月前
|
监控 Serverless 云计算
探索Serverless架构:开发实践与优化策略
本文深入探讨了Serverless架构的核心概念、开发实践及优化策略。Serverless让开发者无需管理服务器即可运行代码,具有成本效益、高可扩展性和提升开发效率等优势。文章还详细介绍了函数设计、安全性、监控及性能和成本优化的最佳实践。
|
2月前
|
弹性计算 算法 搜索推荐
活动实践 | 通过函数计算部署ComfyUI以实现一个AIGC图像生成系统
ComfyUI是基于节点工作流稳定扩散算法的新一代WebUI,支持高质量图像生成。用户可通过阿里云函数计算快速部署ComfyUI应用模板,实现个性化定制与高效服务。首次生成图像因冷启动需稍长时间,之后将显著加速。此外,ComfyUI允许自定义模型和插件,满足多样化创作需求。
|
2月前
|
弹性计算 自然语言处理 搜索推荐
活动实践 | 基于函数计算部署GPT-Sovits模型实现语音生成
通过阿里云函数计算部署GPT-Sovits模型,可快速实现个性化声音的文本转语音服务。仅需少量声音样本,即可生成高度仿真的语音。用户无需关注服务器维护与环境配置,享受按量付费及弹性伸缩的优势,轻松部署并体验高质量的语音合成服务。
|
2月前
|
运维 监控 Serverless
揭秘云计算中的Serverless架构:优势、挑战与实践
揭秘云计算中的Serverless架构:优势、挑战与实践
|
4月前
|
人工智能 自然语言处理 Serverless
阿里云函数计算 x NVIDIA 加速企业 AI 应用落地
阿里云函数计算与 NVIDIA TensorRT/TensorRT-LLM 展开合作,通过结合阿里云的无缝计算体验和 NVIDIA 的高性能推理库,开发者能够以更低的成本、更高的效率完成复杂的 AI 任务,加速技术落地和应用创新。
183 13
|
5月前
|
Serverless API 异构计算
函数计算产品使用问题之修改SD模版应用的运行环境
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。

相关产品

  • 函数计算