当前位置: 首页 > news >正文

函数性能探测:更简单高效的 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

点击此处立即体验

相关文章:

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

作者:拂衣、丛霄 2019 年 Berkeley 预测 Serverless 将取代 Serverful 计算成为云计算新范式。Serverless 为应用开发提供了一种全新系统架构。借助 2023 年由 OpenAI 所带来的 AIGC 风潮,以阿里云函数计算 FC、AWS Lambda 为代表的 Serverless 以其更高…...

嵌入式Linux Qt5 (C++)开发栏目概述

本栏目开始介绍Linux系统下的Qt C程序开发,资源是以嵌入式为切入点(现在Linux系统下的Qt C程序开发好像就是应用于嵌入式),那就跟着一起学习Linux系统下的Qt C程序开发知识,再扩展一下嵌入式的知识吧。我这里默认已经熟…...

C语言“牵手”微店商品详情数据方法,微店商品详情API接口申请指南

微店平台的商品详情通常包括以下信息: 商品名称:展示商品的名称,用于描述商品的特性和分类。 商品图片:展示商品的图片,可以有多张图片以展示不同角度和细节。 商品价格:显示商品的销售价格,可…...

C++ volatile

volatile 一、volatile 使用场景 volatile 是 C 和 C 中的一个关键字,用于告诉编译器不要对标记为 volatile 的变量进行优化,以确保每次访问都从内存中读取变量的最新值。主要用于以下情况: 硬件寄存器和内存映射设备:在访问硬…...

空洞卷积学习笔记

文章目录 1. 扩张卷积的提出2. 理解的难点 本片博客的主题思路来自于这篇文章——如何理解Dilated Convolutions(空洞卷积),但是作者似乎是很久之前写的,文字的排版很混乱,自己来写一个新的。 1. 扩张卷积的提出 Multi-Scale Context Aggre…...

WPF中的UseLayoutRounding和SnapsToDevicePixels

WPF中的UseLayoutRounding和SnapsToDevicePixels 最近在调试项目中的UI时发现几个诡异问题: Grid容器里的GridSplitter设置粗细一样, 但截屏放大后发现线条不一样粗并且明暗不一致,导致打印出来有问题。 自定义控件的边缘在某些窗体中显示模…...

Windows权限维持—自启动映像劫持粘滞键辅助屏保后门WinLogon

Windows权限维持—自启动&映像劫持&粘滞键&辅助屏保后门&WinLogon 1. 前置2. 自启动2.1. 路径加载2.1.1. 放置文件2.1.2. 重启主机 2.2. 服务加载2.2.1. 创建服务2.2.2. 查看服务2.2.3. 重启主机 2.3. 注册表加载2.3.1. 添加启动项2.3.2. 查看注册表2.3.3. 重启…...

Mysql之explain详解

1. explain作用 使用explain可以展示出sql语句的执行计划,再根据sql的执行计划去判断这条sql有哪些点可以进行优化,从而让sql的效率达到最大化。 2. 执行计划各列含义 (1)id:id列是select的序列号,这个…...

每天一道leetcode:1926. 迷宫中离入口最近的出口(图论中等广度优先遍历)

今日份题目: 给你一个 m x n 的迷宫矩阵 maze (下标从 0 开始),矩阵中有空格子(用 . 表示)和墙(用 表示)。同时给你迷宫的入口 entrance ,用 entrance [entrancerow, …...

Mysql_5.7下载安装与配置基础操作教程

目录 一、Mysql57下载与安装 二、尝试登录Mysql 三、配置Mysql环境变量 一、Mysql57下载与安装 首先,进入Mysql下载官网:MySQL Community Downloads 随后,选择版本5.7.43,系统选择Windows,随后下方会出现两个下载选…...

【业务功能篇68】电商项目相关核心设计

https证书 http 超文本传输协议: 超文本:包括:文字,图片,音频,视频等。 传输:客户端向服务端发东西,服务端向客户端发东西。 协议:三方协议。怎么传,错误…...

微信开发之一键退出群聊的技术实现

简要描述: 退出群聊 请求URL: http://域名地址/quitChatRoom 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必选类型说明wI…...

〔012〕Stable Diffusion 之 中文提示词自动翻译插件 篇

✨ 目录 🎈 翻译插件🎈 下载谷歌翻译🎈 谷歌翻译使用方法🎈 谷歌翻译使用效果 🎈 翻译插件 在插件列表中搜索 Prompt Translator可以看到有2个插件选项:一个是基于谷歌翻译 〔推荐〕、一个基于百度和deepl…...

【C++】一文带你初识C++继承

食用指南:本文在有C基础的情况下食用更佳 🍀本文前置知识: C类 ♈️今日夜电波:napori—Vaundy 1:21 ━━━━━━️💟──────── 3:23 …...

SDK是什么,SDK和API有什么区别

SDK(Software Development Kit)是一种开发工具包,通常由软件开发公司或平台提供,用于帮助开发人员构建、测试和集成特定平台或软件的应用程序。SDK 包含一系列的库、工具、示例代码和文档,旨在简化开发过程并提供所需的…...

golang中使用chan控制协程并发简单事例

func main() {processNum : 5ch : make(chan struct{}, processNum)for true {ch <- struct{}{}go func() {defer func() {<-ch}()fmt.Println("我是协程", time.Now().UnixNano())time.Sleep(time.Second * 5)}()} } 可以看到&#xff0c;这里每5s会执行一次带…...

好用画流程图软件推荐 excalidraw

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;蚂蚁集团高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《EffectiveJava》独家解析》专栏作者。 热门文章推荐…...

【RP2040】香瓜树莓派RP2040之搭建开发环境(windows)

本文最后修改时间&#xff1a;2022年08月23日 01:57 一、本节简介 本节以树莓派pico开发板为例&#xff0c;搭建windows下的编译环境。 二、实验平台 1、硬件平台 1&#xff09;树莓派pico开发板 ①树莓派pico开发板 ②micro usb数据线 2&#xff09;电脑 2、软件平台 …...

基于springboot线上礼品商城

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

开源,微信小程序 美食便签地图(FoodNoteMap)的设计与开发

目录 0 前言 1 美食便签地图简介 2 美食便签地图小程序端开发 2.1技术选型 2.2前端UI设计 2.3主页界面 2.4个人信息界面 2.5 添加美食界面 2.6美食便签界面 2.8 美食好友界面 2.9 美食圈子界面 2.10 子页面-店铺详情界面 2.11 后台数据缓存 2.12 订阅消息通知 2.1…...

kubernetes集群(k8s)之安装部署Calico 网络

目录 安装部署Calico 网络 &#xff08;一&#xff09;环境准备 &#xff08;二&#xff09;部署docker环境 &#xff08;三&#xff09;部署kubernetes集群 &#xff08;四&#xff09;部署Calico网络插件 安装部署Calico 网络 &#xff08;一&#xff09;环境准备 IP地…...

【C/C++】C++11 Lambda 表达式捕获变量使用技巧

在 C11 中&#xff0c;lambda 表达式可以通过捕获列表来捕获指定的变量。捕获列表是放在 lambda 表达式参数列表之前的一对方括号 [] 中&#xff0c;用来指定 lambda 表达式捕获哪些变量。 捕获列表有以下几种形式&#xff1a; []&#xff1a;不捕获任何变量。[&]&#x…...

大势智慧软硬件技术答疑第八期

1.DasViewer可以使用同一个账号登录多台电脑&#xff0c;然后同时进行格式转换操作吗&#xff1f; 答&#xff1a;可以的 2.在DasViewer里面添加了标注点&#xff0c;能手动修改标注点坐标、手动输入坐标值 吗&#xff1f; 答&#xff1a;目前DasViewer暂不支持手动输入坐标 …...

jvm-jvm与java体系结构

1.JAVA及JVM简介 jvm发展历程 sun classic vm jdk1.4时完全被淘汰 2.虚拟机与JAVA虚拟机 java虚拟机就是二进制字节码的运行环境&#xff0c;负责装载字节码到其内部&#xff0c;解释/编译为对应平台上的机器指令执行&#xff0c;每一条java指令&#xff0c;java虚拟机中都有…...

Three.js 实现材质边缘通道发光效果

相关API的使用&#xff1a; 1. EffectComposer&#xff08;渲染后处理的通用框架&#xff0c;用于将多个渲染通道&#xff08;pass&#xff09;组合在一起创建特定的视觉效果&#xff09; 2. RenderPass(是用于渲染场景的通道。它将场景和相机作为输入&#xff0c;使用Three.…...

【MFC】10.MFC六大机制:RTTI(运行时类型识别),动态创建机制,窗口切分,子类化-笔记

运行时类信息&#xff08;RTTI&#xff09; C: ##是拼接 #是替换成字符串 // RTTI.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream> #include <afxwin.h>#ifdef _DEBUG #define new DEBUG_NEW #endifCWinApp th…...

ui设计师个人年终工作总结2020最新范文5篇

ui设计师个人年终工作总结(一) 我于20年x育人x日成为公司的试用员工&#xff0c;安排在技术研发中心担任UI界面设计一职&#xff0c;现将我的工作情况分为三个阶段来总结如下汇报&#xff1a; 一、萌芽阶段 记得初次应聘时&#xff0c;我对公司的认识仅仅局限于行业之一&#x…...

开源数据库Mysql_DBA运维实战 (修改root密码)

MySQL——修改root密码的4种方法 本文以windows为例为大家详细介绍下MySQL修改root密码的4种方法&#xff0c;大家可以可以根据的自己的情况自由选择&#xff0c;希望对大家有所帮助 方法1&#xff1a; 用SET PASSWORD命令 首先登录MySQL。 格式&#xff1a;mysql> set pass…...

javap获取Kotlin方法JNI方法签名

获取Kotlin方法签名和JAVA不一样的地方就是需要使用Kotlin 命令行编译器生成.class文件&#xff1a; 编写一个Kotlin类&#xff0c;添加JNI方法&#xff1a; class TestLib {external fun init(callBack: CallBack)interface CallBack{fun onData(count:Int,data:String)} }在…...

ARM-M0内核MCU,内置24bit ADC,采样率4KSPS,传感器、电子秤、体脂秤专用,国产IC

ARM-M0内核MCU 内置24bit ADC &#xff0c;采样率4KSPS flash 64KB&#xff0c;SRAM 32KB 适用于传感器&#xff0c;电子秤&#xff0c;体脂秤等等...