函数性能探测:更简单高效的 Serverless 规格选型方案

作者:拂衣、丛霄

2019 年 Berkeley 预测 Serverless 将取代 Serverful 计算成为云计算新范式。Serverless 为应用开发提供了一种全新系统架构。借助 2023 年由 OpenAI 所带来的 AIGC 风潮,以阿里云函数计算 FC、AWS Lambda 为代表的 Serverless 以其更高成本效益、更简化的后端代码 & 扩展性及更极致的弹性等众多特性,将开发者从繁重的手动资源管理与性能成本优化中解放,再次激发开发者蓬勃的想象力与创造力。国内越来越多开发者及企业开始尝试如何将 Serverless 应用于实际业务或者场景。

但在优雅使用 Serverless 之前,依旧有不少小问题需要提前解决。由于 Serverless 平台的扩缩容是基于请求处理/事件驱动的并发度进行扩缩容的,对于习惯基于 CPU 指标进行 Pod 水平扩缩的的开发者而言,就会遇到以下难题,比如并发度、最小实例数、最大实例数这几个参数之间的关系是什么样的?又比如单个实例最大并发度怎么设置,才能够符合自己的业务需求?

01 Serverless 参数配置的考量维度

Serverless 能提供一定通用能力,但针对不同业务逻辑需要采取合适的配置才能更好的发挥 Serverless 价值。但如何评估函数的最佳配置涉及到多变量协同优化的问题,虽然函数计算 FC 提供了基于应用“每日请求总数”和“平均请求响应时间”的请求预估、基于应用目前使用的服务器“规格”和“利用率”的现有服务器用量预估等方式辅助进行参数配置。但想要更好进行配置,我们建议从以下三个维度去评估配置 Serverless 服务参数。

(1)在成本与性能之间进行取舍

如何根据业务偏好选择性能优先或成本优先是参数配置需要考虑的第一大难点。在单实例多并发数相对固定的情况下,可以提高单实例并行处理请求数量,减少实例数,从而降低成本。当并发数过高时会增加资源竞争,导致性能延迟增加,从而增加成本;如果对于延时敏感度相对较低,可以选取较低实例规格,单价成本更低,与之相反,想要更短延时,可以选择较高的实例规格,但单价成更高。

(2)结合不同函数业务逻辑的复杂度

除了成本和性能取舍,针对不同类型函数逻辑,不同配置参数效果也有着巨大差异。很多函数业务逻辑复杂,只针对单一逻辑分支进行特定配置并不代表整体性能最优;不恰当的配置可能产生大量预期之外的运维成本。对此,我们针对 CPU 密集型、 IO 密集型不同类型函数进行测试,以便更好的挖掘不同规格与不同类型函数TPS之间的关系。

  • 在不同规格下,对 CPU 密集型函数进行压测

在这里插入图片描述

可以看到 CPU 密集型规格越高, maxTPS 越大,规格与 maxTPS 呈现明显线性关系。规格越大,maxRT 越低 ,说明 CPU 密集型的函数,增大资源规格可以显著降低 RT。但规格增大到 4G、8G 后,对 RT 的降低效果边际效应递减。

  • 在不同规格下,对 IO 密集型函数进行压测

在这里插入图片描述

可以看到规格提升对 IO 密集型的性能改善非常有限,规格与 maxRT、maxTPS 关联度有限。特别扩展到高规格后,对于 maxTPS 的提升较小。

借助上面压测,我们可以看到这样子的结论:对于 CPU 密集型函数,规格增加对单实例性能的提升能够提供较大的改善。但对于 IO 密集型函数,规格增加对单实例性能的提升存在边际递减效应。当超过一定规格后,规格提升对性能提升几乎没有提升。

(3)兼顾函数配置对计算资源配置的影响

由于函数并发度、最小实例数、最大实例数等配置会影响到 Serverless 平台的资源分配,保证单函数资源刚性交付、多函数的资源隔离同时,合理利用平台弹性调度能力并提高资源利用率是最后要考虑的问题。

以同时处理 x 个并发请求场景举例,当实例并发度设置为 1 时,每个实例同时只能处理 1 个请求,函数计算需要创建 x 个实例来处理这 x 个请求。当实例并发度设置为 X10 时,每个实例同时可以处理 X10 个请求,函数计算只需要创建 1 个实例就能处理这 x 个请求。

在这里插入图片描述

单实例多并发适用于函数中有较多时间在等待下游服务响应的场景。等待响应一般不消耗资源,在一个实例内并发处理可以节省费用。但较低单实例并发度在函数流量波动变化时会提前达到单实例并发上限,导致实例扩缩容、冷启动更频繁。与此同时,需要创建和维护更多实例个数,造成整体资源利用率偏低。

02 评估参数配置的合理性

结合以上三个维度,我们可以看到评估 Serverless 的参数配置绝非易事。很多用户在开始尝试使用 Serverless 时仅是通过文档指引进行相关参数配置。在函数正式上线后,很快就会发现之前配置不合理,所造成的成本超预期以及性能不及预期等问题,并尝试反复修改函数配置进行验证。资深开发者会选择进行压测,以便测试出最佳的函数配置。但压测脚本配置、压测数据报告解读需要有一定的实践经验,开发者也无法十分笃定压测所得出的配置结论是否是符合业务预期的最优选择。在统计了海量用户实际配置使用情况后,我们发现表示用户实际资源使用量较低,实际配置规格偏大,造成一定的浪费。

在这里插入图片描述

为了更好的验证配置参数的合理性,函数计算 FC 提供基于性能测试 PTS 能力的函数性能探测功能来评估函数单个实例在不同规格下的性能上限,借以推荐满足用户预期延迟的最佳并发度与函数规格配置,探测方法基于 little’s law [ 1] 排队理论(并发数 = 请求的平均延迟 * TPS ),如图示:

在这里插入图片描述

(横坐标是并发数,左边的纵坐标是 TPS,右边的纵坐标是延迟)

由于每个服务器的处理能力都有限,所以会出现随着并发数上升,吞吐量先上升后平缓,可能出现下降,即性能恶化;当并发度过高时,延迟会变高,甚至会急剧恶化。通过性能探测,我们会得到每种规格的关键性能数据,即每个规格最高能承受的 QPS,在知晓自身对业务流量规模前提下,即可得出最恰当的函数所需的最小实例数和最大实例数以最佳规格和规格下的最佳并发度。我们可以只压测单实例,因为在性能表现平稳的系统,多实例的性能是单实例性能的线性叠加,所以只需要压测出单实例的性能,就可以推算出多实例的性能。

比如,用户预期函数调用端到端延迟为 1000 ms,根据 1000 毫秒的延迟限制选型出最佳的规格及该规格下最佳并发度,即满足延迟限制的最高 QPS 的对应并发度。

由于目前性能探测仅支持对 HTTP 函数进行压测,不支持对事件函数进行压测。仅支持单实例压测,不支持多实例压测。因此,我们提供性能探测(单实例)、性能测试 PTS(多实例)两种方式进行验证。

  • 关于性能探测

作为函数计算 FC 的功能之一,为了进一步降低行能探测的使用门槛,功能采取流程化指引,同时性能探测功能完全免费, 用户只需要为函数承接的请求流量付费,不需要为压测功能付费。

在这里插入图片描述

  • 关于性能测试 PTS

作为阿里巴巴集团淘宝双十一的性能测试工具,性能测试 PTS 支持按需发起压测任务,可提供百万并发、千万 TPS 流量发起能力,100% 兼容 JMeter。提供的场景编排、API 调试、流量定制、流量录制等功能,可快速创建业务压测脚本,精准模拟不同量级用户访问业务系统,帮助业务快速提升系统性能和稳定性。目前,提供新用户 5000VUM 的免费试用额度。

03 针对单实例,如何通过性能探测验证单实例配置参数

接下来,我们简单介绍性能探测的配置流程,仅需三步即可快速发起性能探测。

  1. 登录函数计算控制台 [ 2] ,在左侧导航栏选择服务及函数,并在服务列表页面选择目标服务。

  2. 函数管理页面,选择目标函数并在性能探测页签新建压测任务

  3. 单实例性能压测评估页签,输入必要的压测 API 信息(见下表),单击执行压测

(在执行压测前,请先点击 API 测试,验证 API 的 HTTP 请求参数是否配置正确,函数是否能成功执行。)

在这里插入图片描述

  1. 查看压测结果分析报告:在单实例压测结果分析页签,查看压测结果。压测过程中,界面会提示压测预估时间。压测的规格越多,压测时间越长,压测费用也越高。压测结果中包含推荐的实例规格和最佳并发请求数。您还可以从压测结果下方的两张分析图中,查看分析过程。

在这里插入图片描述

说明: 函数计算的压测功能仅支持单实例压测。如您需要配置多实例压测,请单击单实例压测结果分析页签右侧的多实例弹性能力压测,跳转至 PTS 控制台 [3 ] 配置。

  1. 查看单实例压测数据详情:单击查看单实例压测详情跳转至单实例压测数据详情页签,查看每个规格的压测详情。每个规格的压测详情中,您可以看到随着并发度增加,延迟和最大 QPS 的变化情况。

在这里插入图片描述

但需要特别说明的是,性能探测推荐的函数配置优先保证满足性能需求,实现最高的资源利用率,但真正实现最低成本配置,需要结合函数线上历史流量数据分析,进行推荐。在进行成本优化推荐规格时,不仅需要达到节约成本的目的,还需要保证不破坏现有服务的 QoS,即性能不会因为实例规格的降低,而导致延迟增大。

04 针对多实例,如何借助性能测试 PTS 进行多实例配置参数

接下来,我们简单介绍性能测试 PTS 的配置流程,仅需配置 API,即可快速发起压测。

  1. 前往性能测试 PTS 控制台。在左侧导航栏中,选择性能测试>创建场景

  2. 创建场景页面,单击 PTS 压测

在这里插入图片描述

  1. 创建 PTS 场景页面,设置场景名,例如函数计算 Serverless 应用压测,然后在场景配置页签,输入压测 API 名称,例如 demo,单击添加压测节点右侧的[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传图标。在压测 URL 区域中输入上一小节复制保存的 Serverless 应用的访问域名。配置完成后,您可以单击调试 API,验证 API 接口配置是否符合预期。当调试的响应状态码为 200 时,表示该 API 可以正常访问。

在这里插入图片描述

  1. 创建 PTS 场景页面单击施压配置页签,配置相关压测参数,递增模式选择自动递增最大并发输入 500递增百分比输入 20单量级持续时长输入 1,压测总时长输入 5,串联链路1的最大并发权重输入 100,串联链路1的起始百分比输入 20。确认参数后,单击保存去压测。在温馨提示对话框中,确认任务预估的预估消耗,未超过免费额度。确认后单击确定,启动压测。(以上参数仅为示例,请根据实际业务进行调整)

在这里插入图片描述

在这里插入图片描述

  1. 大约等待 3 分钟,即可在压测中页面查看当前应用实时的压测数据。

在这里插入图片描述

  1. 压测中页面,您可以看到成功率、RT 和 TPS 等概览数据。

在这里插入图片描述

  1. 在压测完成之后,会自动跳转到编辑场景页面,然后单击压测报告。在压测报告页签,找到您的压测报告,单击右侧操作列下的查看

在这里插入图片描述

  1. 在压测报告了解详细的压测报告内容,查看本次压测详细的性能数据。关于压测报告的更多详情,请参见查看 PTS 压测报告 [ 4] 。此时已实现通过性能测试 PTS 对 Serverless 应用的压测。

在这里插入图片描述

05 开发者场景体验

目前,「通过性能测试 PTS 对 Serverless 应用进行性能压测」场景已经上线云启实验室。在提供相关的免费试用额度的同时,提供相关操作流程与模板,以便大家快速体验通过 FC 创建应用以及通过 PTS 进行压测。

传送门:https://developer.aliyun.com/adc/scenario/186a9f71954b42419ebfa1f27fd8b042

相关链接:

[1] little’s law

https://en.wikipedia.org/wiki/Little%27s_law

[2] 函数计算控制台

https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Ffcnext.console.aliyun.com%2F&lang=zh

[3] PTS 控制台

https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fpts.console.aliyun.com%2F&lang=zh#/pts/create

[4] 查看 PTS 压测报告

https://help.aliyun.com/document_detail/65304.html

点击此处立即体验

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flink的常用算子以及实例

1.map 特性&#xff1a;接收一个数据&#xff0c;经过处理之后&#xff0c;就返回一个数据 1.1. 源码分析 我们来看看map的源码 map需要接收一个MapFunction<T,R>的对象&#xff0c;其中泛型T表示传入的数据类型&#xff0c;R表示经过处理之后输出的数据类型我们继续往…

在ARM服务器上一键安装Proxmox VE(以在Oracle Cloud VPS上为例)(甲骨文)

前言 如题&#xff0c;具体用到的说明文档如下 virt.spiritlhl.net 具体流程 首先是按照说明&#xff0c;先得看看自己的服务器符不符合安装 Proxmox VE的条件 https://virt.spiritlhl.net/guide/pve_precheck.html#%E5%90%84%E7%A7%8D%E8%A6%81%E6%B1%82 有提到硬件和软…

Redis缓存问题(穿透, 击穿, 雪崩, 污染, 一致性)

目录 1.什么是Redis缓存问题&#xff1f; 2.缓存穿透 3.缓存击穿 4.缓存雪崩 5.缓存污染&#xff08;或满了&#xff09; 5.1 最大缓存设置多大 5.2 缓存淘汰策略 6.数据库和缓存一致性 6.1 4种相关模式 6.2 方案&#xff1a;队列重试机制 6.3 方案&#xff1a;异步更新缓…

基于YOLOV8模型的西红柿目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOV8模型的西红柿目标检测系统可用于日常生活中检测与定位西红柿目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数…

day20 飞机大战射击游戏

有飞行物类 飞行 爆炸 的连环画&#xff0c; 飞行的背景图 &#xff0c; 子弹图&#xff0c; 还有游戏开始 暂停 结束 的画面图。 设计一个飞机大战的小游戏&#xff0c; 玩家用鼠标操作hero飞行机&#xff0c; 射出子弹杀死敌机&#xff0c;小蜜蜂。 敌机可以获得分数&…

浅谈java自定义中类两个对象的比较

目录 实现比较两个对象是否相同 1.前置代码 1.学生类 2.示例 3.输出 4.原因 2.那么我们要怎么做呢? 1.对Student类中重新实现quals方法(即对equals方法重写) 2.完整代码如下: 3.具体操作 4.演示 1.示例 2.输出 3.原因 实现比较两个对象的大小 第一种: 用…

Android 9.0 Vold挂载流程解析(下)

Android 9.0 Vold挂载流程解析&#xff08;上&#xff09; 前言 上一篇介绍了Android 文件系统中Vold挂载机制的总体框架&#xff0c;我们分析了vod进程的main.cpp.接下来我们分析下存储卡挂载和卸载的流程。 存储卡挂载 在上篇文章文章提到&#xff0c;监听驱动层挂载和卸…

【是C++,不是C艹】 手把手带你实现Date类(附源码)

&#x1f49e;&#x1f49e;欢迎来到 Claffic 的博客&#x1f49e;&#x1f49e; &#x1f449; 专栏&#xff1a;《是C&#xff0c;不是C艹》&#x1f448; 前言&#xff1a; 恍惚间&#xff0c;已经两个月没更新了 &#xff08;&#xff1b;д&#xff40;&#xff09;ゞ 我忏…

听GPT 讲Alertmanager源代码--dispatch/silence/inhibit等

目前Alertmanager项目共计53M大小&#xff0c;其中.git占了46M&#xff0c;总的go代码行数不足6万行(包括.pb.go等文件)&#xff0c;不算是一个大项目。 但实现了告警的分发&#xff0c;静默等功能&#xff0c;值的研究&#xff0c;尤其是dispatch中的route部分。 在Prometheus…

2022年03月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;和数 给定一个正整数序列&#xff0c;判断其中有多少个数&#xff0c;等于数列中其他两个数的和。 比如&#xff0c;对于数列1 2 3 4, 这个问题的答案就是2, 因为3 2 1, 4 1 3。 时间限制&#xff1a;10000 内存限制&#xff1a;65536 输入 共两行&#x…

图数据库_Neo4j学习cypher语言_使用CQL_构建明星关系图谱_导入明星数据_导入明星关系数据_创建明星关系---Neo4j图数据库工作笔记0009

首先找到明星数据 可以看到有一个sheet1,是,记录了所有的关系的数据 然后比如我们搜索一个撒贝宁,可以看到撒贝宁的数据 然后这个是构建的CQL语句 首先我们先去启动服务 neo4j console 然后我们再来看一下以前导入的,可以看到导入很简单, 就是上面有CQL 看一下节点的属性

验证二叉搜索树

给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 示例 1&#xff1a; 输…

关于lattice planner

使用编程创建驾驶场景。 1.使用Driving scenario Designer 交互方式创建驾驶场景 2.导出matalb function 3.修正这个函数&#xff0c;创建原始场景的变体。 4.调用这个函数&#xff0c;生成drivingScenario object。 5.在simulink中仿真&#xff0c;导入这个objcet &…

探索线程池的威力:优化多线程任务管理与性能提升

比喻举例&#xff08;可以比作工人队伍&#xff09; 想象一下&#xff0c;如果我们需要完成很多工作&#xff0c;我们可以招募一群工人来协助。然而&#xff0c;如果每个工人都是临时招募的&#xff0c;工作完成后就解雇他们&#xff0c;那么每次都要花时间和精力来招募和解雇工…

蓝桥杯上岸每日N题 (闯关)

大家好 我是寸铁 希望这篇题解对你有用&#xff0c;麻烦动动手指点个赞或关注&#xff0c;感谢您的关注 不清楚蓝桥杯考什么的点点下方&#x1f447; 考点秘籍 想背纯享模版的伙伴们点点下方&#x1f447; 蓝桥杯省一你一定不能错过的模板大全(第一期) 蓝桥杯省一你一定不…

使用VisualStudio制作上位机(一)

文章目录 使用VisualStudio制作上位机(一)写在前面第一部分:创建应用程序第二部分:GUI主界面设计使用VisualStudio制作上位机(一) Author:YAL 写在前面 1.达到什么目的呢 本文主要讲怎么通过Visual Studio 制作上位机,全文会以制作过程来介绍怎么做,不会去讲解具体…

【Java】常见面试题:HTTP/HTTPS、Servlet、Cookie、Linux和JVM

文章目录 1. 抓包工具&#xff08;了解&#xff09;2. 【经典面试题】GET和POST的区别&#xff1a;3. URL中不是也有这个服务器主机的IP和端口吗&#xff0c;为啥还要搞个Host&#xff1f;4. 补充5. HTTP响应状态码6. 总结HTTPS工作过程&#xff08;经典面试题&#xff09;7. H…

最长回文子序列——力扣516

动态规划 int longestPalindromeSubseq(string s){int n=s.length();vector<vector<int>>

11. Docker Swarm(二)

1、前言 上一篇中我们利用Docker Swarm搭建了基础的集群环境。那么今天我们就来验证以下该集群的可用性。上一篇的示例中&#xff0c;我创建了3个实例副本&#xff0c;并且通过访问http://192.168.74.132:8080得到我们的页面。 2、验证高可用 1&#xff09;我们可以通过以下命…

一文读懂视频号下载

工具&#xff1a; 移动端抓包工具&#xff08;以Stream为例&#xff09;电脑端浏览器电脑端析包工具&#xff08;以Charles为例&#xff09;【可选项】 一、手机抓包 1 开启Stream 2 抓包 手机进入视频号&#xff0c;通过“搜索“的方式发送get请求&#xff0c;达到抓包的效…