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

news/2024/5/20 9:26:33 标签: 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

点击此处立即体验


http://www.niftyadmin.cn/n/4949205.html

相关文章

故障解析 | 生产环境遇到MySQL数据页损坏问题如何解决?

当数据页破坏,如何根据实例的健康状况选择不同的策略定位损坏文件并恢复。 作者:徐文梁 爱可生 DBA 成员,一个执着于技术的数据库工程师,主要负责数据库日常运维工作。擅长 MySQL,Redis 及其他常见数据库也有涉猎&…

神卓互联内网穿透搭建云表系统

云表是什么? 云表系统是一种无代码开发平台,它具备完善的功能和各种业务级应用管理模板,可以帮助中小企业快速开发和定制自己的系统。通过云表系统,用户可以使用表格编程的开发方式,就像使用Excel一样简单&#xff0c…

selenium +Jmeter 的性能测试

通过Jmeter快速将已有的Selenium 代码以性能测试的方式组织起来,并使用JMeter 丰富的报表展示测试结果 from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By driver …

虽然每天都在一线coding,但是如果不是经常温习一些面试题,真的有时候会被问蒙

前言 虽然每天都在一线coding,但是如果不是经常温习一些面试题,真的有时候会被问蒙。因为技术的东西是在大多台繁杂了,不经常用就很容易淡忘,但是有经验有能很快处理开发中的问题。技术无止境,人生苦短,35岁是程序员的一道坎,能转管理路线尽量转管理路线。 一、有了 f…

解决Linux虚拟机IP无法显示的问题

目录 问题: 两种解决方案,供大家选择使用哦。 第一种解决办法: 第二种解决办法: 1、查看ens33网卡的配置 2、修改文件 扩展: 问题: Linux命令 ip a 查看ip时,无法显示IP的解决办法。 两…

华为OD机试 - 排队游戏(Java JS Python)

题目描述 新来的老师给班里的同学排一个队。 每个学生有一个影力值。 一些学生是刺头,不会听老师的话,自己选位置,非刺头同学在剩下的位置按照能力值从小到大排。 对于非刺头同学,如果发现他前面有能力值比自己高的同学,他不满程度就增加,增加的数量等于前面能力值比…

学习Vue:项目构建与部署

在开发一个Vue.js项目之后,项目的构建与部署是至关重要的步骤。本文将详细介绍项目的打包与优化,环境变量与不同环境的配置,以及将Vue.js项目部署到服务器的步骤,旨在帮助您更好地完成项目的上线工作。 项目的打包与优化 项目的打…

Ubuntu中怎么清空mysql数据

要清空 MySQL 数据,可以使用以下步骤来执行。请注意,这将会永久删除数据库中的所有数据,请谨慎操作,并在操作前备份重要数据。 登录 MySQL: 打开终端,使用以下命令登录到 MySQL 数据库。根据情况&#xf…