Serverless 应用优化四则秘诀

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

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

资源评估依旧重要

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

一般情况下,FaaS 平台的收费是和三个指标具有直接关系的:

所配置的内存规格;

程序所消耗的时间;

以及产生的流量费用。

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

阿里云

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

合理的代码包规格

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

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

可以设想一下,当我们有两个压缩包,一个是只有 100KB 的代码压缩包,另一个是 200MB 的代码压缩包,两者同时在千兆的内网带宽下理想化(即不考虑磁盘的存储速度等)下载,即使最大速度可以达到 125MB/S,那么前者的下载速度只有不到 0.01s,后者需要 1.6s。除了下载时间之外,还有文件的解压时间,那么两者的冷启动时间可能就相差 2s。

一般情况下,一个传统的 Web 接口,如果要 2s 以上的响应时间,实际上对很多业务来说是不能接受的,所以在我们打包代码时就要尽可能的降低压缩包大小。以 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”,我们可以统计结果:

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

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

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

善于利用函数特性

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

1、Pre-freeze & Pre-stop

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

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

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

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

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

2、单实例多并发

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

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

单实例多并发效果简图

单实例多并发的优势如下:

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

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

原文链接

本文为阿里云原创内容,未经允许不得转载。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

懵了,构建一个 Docker 镜像花 60 分钟?如何提高效率?

作者 | Andy来源 | 进击云原生最近,有一个需求:向镜像构建管道添加一个参数,以允许用户在构建时配置超时时间。我们计划在构建时配置 10 分钟的默认超时,并且允许用户覆盖此配置,因为他们的某些镜像构建需要长达 60 分…

java实现短信上行源码_Java 发送短信验证码 示例源码

【实例简介】执行前请先设置修改 src/test.java 文件//用户名private static String Uid "uid";//接口安全秘钥(不是登录密码)private static String Key "key";//手机号码,多个号码如13800000000,13800000001,13800000002private static Str…

Android项目架构设计深入浅出

简介:本文结合个人在架构设计上的思考和理解,介绍如何从0到1设计一个大型Android项目架构。 作者 | 璞珂 来源 | 阿里技术公众号 前言:本文结合个人在架构设计上的思考和理解,介绍如何从0到1设计一个大型Android项目架构。 一 引…

技术实践第四期|解读移动开发者日常-性能监控平台应用

简介:应用性能监控平台是用来帮助客户提升应用性能质量和稳定性的重要环节,本人作为一名移动端开发者有着丰富的使用和运维经验,希望通过本文分享过往的心得和使用经验,让我参与开发的U-APM这款产品中,作为借鉴可以在中…

彻底理解操作系统:CPU与实模式

作者 | 陆小风来源 | 码农的荒岛求生‍对于人类来说,我们不喜欢拐弯抹角,喜欢更直接的东西,“有话直说”、“没有中间商赚差价”、“简洁的设计”等等,然而对于计算机,尤其是对内存管理来说则恰恰相反,在这…

边缘计算的 4 种类型都有哪些?

作者 | Addo Zhang来源 | 云原生指北本篇文章译自 SUNKU RANGANATH 的 4 Types of Edge Computing - Broadly Categorized。文章通过 往返终端设备和数据中心的延迟 来对边缘计算的类型进行大致的分类,通俗易懂,方便大家对边缘计算有个大概的了解。边缘计…

OpenKruise v1.0:云原生应用自动化达到新的高峰

简介:OpenKruise 是针对 Kubernetes 的增强能力套件,聚焦于云原生应用的部署、升级、运维、稳定性防护等领域。 云原生应用自动化管理套件、CNCF Sandbox 项目 -- OpenKruise,近期发布了 v1.0 大版本。 OpenKruise[1] 是针对 Kubernetes 的…

Serverless Kubernetes 落地实践

简介:如何通过原生 Kubernetes 提供 Serverless 能力?如何借力丰富的云原生社区生态?本文将给大家介绍一下我们在 Serverless Kubernetes 上的落地实践。 作者:元毅 导读 Kubernetes 作为当今云原生业界标准,具备良…

如何在零停机的情况下迁移 Kubernetes 集群

简介:本文将通过集群迁移的需求、场景以及实践方式,介绍如何基于阿里云容器服务 ACK,在零停机的情况下迁移 Kubernetes 集群。 作者:顾静(子白)|阿里云高级研发工程师;谢瑶瑶&#…

轻松理解 Docker 网络虚拟化基础之 veth 设备!

作者 | 张彦飞allen来源 | 开发内功修炼最近我又对网络虚拟化技术产生了浓厚的兴趣,迫切想搞明白在 Docker 等虚拟技术下,网络底层是如何运行的。不得不说,网络虚拟化技术是我给自己抛的又一个大坑。虽然我自认为把原生 Linux 网络实现过程理…

如何做好数字化体验管理,了解一下?

简介:本文主要分为三部分,第一部分是数字化体验的必要性,从数字化体验管理对业务的影响和数字化体验管理对企业的价值两个方面来介绍其必要性;第二部分,ARMS 在数字化体验管理上的产品能力介绍;第三部分&am…

深信服智能边缘计算平台与 OpenYurt 落地方案探索与实践

简介:本文将介绍边缘计算落地的机遇与挑战,以及边缘容器开源项目 OpenYurt 在企业生产环境下的实践方案。 作者:赵震,深信服云计算开发工程师,OpenYurt 社区 Member 编者案:在 5G、物联网等新技术的持续推…

云原生的本手、妙手和俗手

作者 | 步尔斯特来源 | 步尔斯特刚刚看到一个话题:Java大军,真的开始把目光从Spring Cloud转向云原生系的k8s Istio了么?乍一看,有一丝不解,Java大军?Spring Cloud?Kubernetes?Serv…

云原生背景下故障演练体系建设的思考与实践—云原生混沌工程系列之指南篇

简介:生产环境的突袭演练是我们迈出的艰难但有力的一步,锻炼了研发运维人员的应急响应能力,在真实用户场景下锤炼系统,推进了产品的轮班制度,提升了云原生底座的稳定性和竞争力。 作者:智妍(郑…

Spring Boot Serverless 实战系列“部署篇” | Mall 应用

简介:本篇中为各位讲述如何将 Mall 应用部署到函数计算平台上。为了让分析更有代表性,我选择了 Github 上 star 数超过 50k 的电商应用 mall 作为示例。 作者:西流 导读:Spring Boot 是基于 Java Spring 框架的套件,它…

押宝云原生,Ampere Computing打响服务器芯片变革关键一枪

“闯龙潭,越虎穴”这句话用来形容在服务器领域披荆斩棘的Arm架构服务器器芯片似乎最为合适不过。所谓“龙潭”“虎穴”指的便是雄霸服务器芯片市场数载的intel与AMD,而他们所属的x86架构,更是数据中心芯片领域的绝对主流。然而云原生时代的到…

阿里云实时数仓Hologres年度发布,解读数仓新趋势

简介:阿里云实时数仓Hologres年度发布,解读数仓新趋势。 1月7日,阿里云实时数仓Hologres发布最新版本,在成本、可用性、在线高可用等多方面进行了能力升级,行存吞吐提升100%,列存吞吐提升30%,支…

服务发现与配置管理高可用实践

简介:本篇是微服务高可用最佳实践系列分享的开篇,系列内容持续更新中,期待大家的关注。 作者:三辰|阿里云云原生微服务基础架构团队技术专家,负责 MSE 引擎高可用架构 本篇是微服务高可用最佳实践系列分享…

联想首次详解混合云Lenovo xCloud五大优势,如何打造智能化数字底座

多年积累之后,联想混合云品牌Lenovo xCloud主打云原生、智能运维、私有云、多云管理4大产品家族,9款通用解决方案,覆盖客户“建云、上云、用云和管云”的全部场景 6月10日,联想举办“弹性韧性悟性——多云混合时代Lenovo xCloud提…

阿里云何川:开放兼容的云,计算巢帮助合作伙伴云化升级

简介:保障业务稳定性,提供安全的云上互联网,助力合作伙伴实现规模化,打通多渠道分发。 12月21日,在阿里云弹性计算年度峰会上,阿里云弹性计算高级产品专家何川发表了题为《开放兼容的云,计算巢…