云原生之深入解析基于FunctionGraph在Serverless领域的FinOps的探索和实践
一、背景
- Serverless 精确到毫秒级的按用付费模式使得用户不再需要为资源的空闲时间付费。然而,对于给定的某个应用函数,由于影响其计费成本的因素并不唯一,使得用户对函数运行期间的总计费进行精确的事先估计变成了一项困难的工作。
- 以传统云资源的周期性租赁模式为例,通过周期数乘以周期单价,用户可以很容易地估计出租赁期间的总费用,形成清晰的心理账户预期,即使在云平台采用阶梯定价或价格歧视策略的情形下,计算租赁总成本也不是一件难事。
- 但在 Serverless 场景中,事先估计函数总成本仍缺乏有效的理论指导。一方面,影响函数计费的关键因素不唯一,如包括函数内存规格、单实例并发度、函数执行时长等;另一方面,函数调用流量的波动通常具有随机性和非平稳性,使得基于流量的“按用计费”具有较大的不确定性。
- 当然,寻找函数计费的理论指导主要是为用户评估函数总成本提供一种有效依据,但更加重要地,如何进一步利用估计模型,帮助用户优化应用函数及其配置选择,进而显著降低用户函数总成本,是 Serverless 领域中,FinOps 亟待回答的问题。
- FinOps 聚焦云上资源管理和成本优化,通过有机链接技术、业务、和财务专业人士,来优化用户、企业、组织的云资源成本,提高云上业务的投入产出比。结合华为云 FunctionGraph 在 Serverless 领域的 FinOps 探索和实践,剖析 Serverless 场景下的函数计费模式和关键影响因素,分享一种对函数运行期间总计费进行事先估计的模型框架;更重要地,该模型为帮助用户优化函数运行总成本、提升用户云上 Serverless 资源管理效能,实现经济型 Economical Serverless 提供有效依据。
- Serverless 函数常见名词:
内存规格 | Memory | MB |
---|---|---|
单实例最大并发度 | Maximum Requests per Instance | / |
函数执行时延 | Function Execution Time | ms |
单函数最大实例数 | Maximum Instances per Function | / |
- 内存规格(Memory):内存规格也即函数规格、函数实例规格,表示 Serverless 平台为函数的单个实例所分配的资源大小,一般表示为函数可使用的内存大小,由用户指定;实例可使用的 CPU 份额与内存大小成正比。Serverless 云平台通常提供多种规格供用户选择,以 FunctionGraph 为例,用户可选 15 种函数规格。
- 函数执行时延(Function Execution Time):这里指完成一次调用请求响应的过程中,函数本身执行所消耗的时间,主要由函数代码逻辑决定。一般地,对于 CPU 密集型的函数,增大函数资源规格(内存-CPU Share),可以显著降低函数执行时延,但对于消耗大部分时间在网络 IO 等操作上的函数,增大资源规格对执行时延的改善则非常有限。
- 单实例最大并发度(Maximum Requests per Instance):函数的单个实例可以同时处理的最大请求数,主要适用于函数执行过程中有显著时间在等待下游服务返回的场景,如访问数据库操作或磁盘 IO 等,对于相同的流量负载,提高函数的单实例并发度可以降低按量实例个数,为用户节省计费,同时,也可以降低函数调用请求的冷启动比例。
- 单函数最大实例数(Maximum Instances per Function):指同一函数同一时刻下同时运行的实例数上限。对用户来说,最大实例数可以防止异常流量洪峰下或函数发生故障时由于云平台的过度扩容而导致的费用失控;对云平台来说,最大实例数可以防止异常情况下平台资源被部分函数耗光,从而保障不同函数间的性能隔离。
二、函数计费与成本模型
- 单实例视角下的函数计费估计模型,在真实生产环境中,除异步函数外,Serverless 云平台通常采用FCFS(First Come First Serve)的方式响应调用请求,对于函数流量的潮汐波动,平台通过自动扩缩容实例进行自适应,系统中运行的并发实例数随时间的变化,可以由一个分段常线性函数完全刻画,如下所示:
- 尽管不同 Serverless 云厂商之间的计费方法存在差异,函数计费一般主要包括两部分:对函数所使用资源的计费以及对请求次数的计费,表示如下:
- 其中, 图片表示对资源使用的计费,单位为 GB-秒(GB-second), 表示对调用次数的计费。为方便计算,用 MGB 表示函数的资源规格,单位为 GB。例如,对于 128MB 规格的函数,其 MGB = 128/1024;c 表示该函数的单实例并发数,μ 表示函数的平均执行时延,单位为毫秒;并用 α(0<α<1)表示 Serverless 平台的调用链路性能,在最理想的情况下,该指标为 1,表示在当前 Serverless 平台上,该函数响应单个请求的端到端时延等于函数执行时延 μ 本身,不同 Serverless 平台的 α 值可能略有不同,但通常在 0.9 以上。给定上述指标,可以得到单实例在理想状况下的请求处理能力,即理论上每秒可以响应的调用次数为:
- 因此,单实例的实际请求处理能力则为:
- 以一个月作为估计周期,假设一个月内,函数共经历了 n 次扩、缩容,形成了 n 个常线性子区间。先考察单个子区间 ΔTsecond 内的计费成本模型,总成本模型则为各个连续子区间的加和。
- 在时间窗口 ΔTsecond 内,假设函数调用次数为 QΔT,则该时间窗内的并发实例数为:
- 对应的资源计费部分则可表示为:
- 其中,PGB-second 表示每GB-秒的资源的计费单价。现在,记第 i 个子区间为 ΔTi,则一个月内的总成本模型可以估计为:
- 其中,PRequest 表示每次调用的计费单价,Q=∑n~i = 1QΔTi~ 表示函数该月总流量,CostGB-second-free 为云平台提供的月度免费计量时间,Qfree 为月度免费计量调用次数。
- 在上式中,单实例并发度 c 和函数规格 MGB 可以认为在用户配置之后属于常数;α 属于平台侧参数,也可视作常数;对于函数执行时延 μ,实际中通常会由于冷热启动差异、网络抖动、调用请求入参等的不同而波动,且考虑到 Serverless 计费是精确到毫秒级别的,因此严格意义上不能被视作为常数。不过,作为估计模型,这里暂且假定 μ 也为常数。综上,总成本模型可以表示为:
- 后半部分代表云平台提供的免计费总量,与函数调用流量以及函数配置无关。
三、成本优化方法
- 有了函数成本的估计模型,就可以对影响用户成本的关键因素进行讨论。在上面的估计式中,忽略云平台提供的免计费总量,函数月度总成本的结构如下:
① 优化函数代码逻辑本身,降低函数执行时延
- 对于同样的函数流量负载,更低的执行时延μ可以为用户节省更多计费成本。在用户业务逻辑允许的前提下,不断优化函数代码、提高函数执行效率是软件工程本身天然的诉求,但在 Serverless 场景下,这一点显得更为迫切。
- 具体地,考虑采用 Python、Nodejs 等轻量化编程语言,减少函数初始化配置中的非必要项,将连接其它服务如数据库等的操作尽量移到函数执行入口之前的初始化阶段完成,简化代码逻辑等。
- 另外,为帮助用户掌握函数运行情况,Function Graph 为应用函数提供深度可视化的可观测能力,支持丰富的观测指标配置,包括调用次数、错误次数、运行时延等,如下所示的函数运行时间监控示例:
② 优化函数代码包、依赖包、镜像大小
- 当函数调用触发冷启动的时候,从计费角度看,冷启动时延包含在执行时延 μ 中一起计费,而冷启动中有相当比例的时延消耗在云平台从第三方存储服务(如华为云对象存储服务 OBS)中下载用户的代码包、依赖包,或从镜像仓库服务中拉取用户应用镜像,如下所示:
- 尽管为了优化冷启动性能,目前大部分云平台均会采用各类缓存机制,对用户代码和镜像进行预缓存,但实例启动中消耗在用户代码加载上的时延仍然十分显著。因此,应尽可能优化函数代码包大小,包括对依赖包、镜像等进行瘦身,进而降低计费时长。
③ 编写功能聚焦的轻量化函数
- 在 Serverless 编程框架下,尽可能将函数编写为轻量型的、功能聚焦的程序代码,即“functions should be small and purpose-built”;让“一个函数只做一件事”,一方面,功能单一的函数,运行时延也更容易针对性地进行优化;另一方面,当一个函数内同时实现多个功能的时候,大概率会以所有功能都在性能上同时做出妥协为结果,最终提高了函数运行期间总计费。
- 若应用函数的确需要提供多个功能,可以考虑将大函数分解为多个小函数,然后通过函数编排的方式实现整体逻辑,下所示的 FunctionGraph 函数流功能。大函数分解也是 Serverless 计算中用户处理超时(timeout)等异常场景的最佳实践之一。
④ 业务模型支持的前提下,采用单实例多并发
- 从上面公式的函数成本结构中可以看出,在用户业务模型支持的前提下,配置一定的单实例并发度 c,可以有效降低函数月度总成本;若用户不进行配置,云平台默认值通常为1,即单个实例同一时刻只能处理一个请求;因此,在函数被并发调用的情形下,平台会启动多个实例进行响应,从而增大了计费实例数目,如下所示;同时,采用单实例多并发,也能改善调用请求处于等待状态的尾时延:
- 当然,单实例并发度并非越高越好,例如,过高的并发度设置会使得函数实例内多线程之间的资源竞争加剧(e.g., CPU contention),导致函数响应性能恶化,影响用户应用的 QoS 指标等。同时,如本文在背景知识中所提,并非所有的应用函数都适合设置单实例多并发。单实例多并发主要适用于函数执行过程中有相当比例的时延消耗在等待下游服务返回的场景,这类场景下,实例资源如 CPU 等有显著比例处于空闲等待状态,如访问数据库、消息队列等中间件、或磁盘 IO、网络 IO 等。单实例多并发也需要用户在函数代码中对错误捕获(e.g., 考虑请求级别的错误捕获粒度)和全局共享变量的线程安全(e.g., 加锁保护)问题进行适配。
⑤ 函数资源规格的选择需考虑对执行时延的影响
- 从函数月度总成本的结构的公式明显可以看出,更大规格的实例内存图片对应更高的计费成本。但内存规格的选择,需要同时考虑对函数执行时延 μ 的影响。从用户函数的角度看,函数执行时延除了由代码本身的业务逻辑决定之外,还受实例运行时可使用资源大小的影响。更大的实例规格,对应更大的可使用内存和更多的 CPU 份额,从而可能显著改善高内存占用型或 CPU 密集型函数的执行性能,降低执行时延;当然,这种改善也存在上限,超过某个资源规格后,资源的增加对降低函数执行时延的效果几乎可以忽略,上述事实表明,对于给定的用户函数,为降低总计费成本,需要配置合理的实例规格图片,使得图片尽可能取得最小值,如图7中实线所表示的过程。如下所示:
- 例如,考虑实例规格的初始配置为 m0GB,例如从最小规格开始,i.e., 128MB), 经测试该规格下函数执行时延为 μ0,则可以得到基线 m0GB · μ0,然后逐步增大资源规格,测试对应执行时延,直到某一组 (miGB, μi)出现,使得:
- 此时表明,资源增大对计费成本的边际提升已经超过了对执行时延的边际改善,因此,从成本的角度看,此时的 miGB 为帕累托最优解,即最佳规格,对应执行时延为 μi。
- 最后,如下,对上述几个决定函数成本的关键因素做了一个总结,其中,箭头方向表示元素之间的直接影响,“+”号代表成正比,“-”代表成反比:
四、Serverless 函数成本研究中心
- 为用户降本增效,是 FunctionGraph 的核心理念,尽管前文分析的五种函数成本优化手段是站在用户视角下的讨论,但这些问题远不是只属于用户需要考虑的范围;相反地,FunctionGraph 在持续探索如何最大限度地帮助用户在 Serverless 领域实现最佳的 FinOps 效果,让用户能够真正享受到 Economical Serverless 的福利;例如,在实例级别的深度可视化、可观测性前提下,帮助用户实现函数 FinOps 全流程的自动化,为用户提供透明、高效、一键式的函数资源管理和成本优化服务。
- 为此,基于内部实践,FunctionGraph 将于近期推出“用户函数成本研究中心 – Cost Analysis and Optimization Center”,为用户提供包括离线式函数最佳配置调优(offline power tuning)、在线式资源消耗感知与规格动态推荐(online resource recommendation, 如图9所示)、预测性函数弹性预览(predictive auto-scaling preview)等在内的多个重量级特性服务,最大限度降低用户实现函数FinOps 的技术门槛,为用户业务开发、Serverless 化改造等提供极致便捷性。
五、总结
- 一项新兴技术领域的兴起,首先需要回答的问题是“Why & Value”,FunctionGraph 作为华为元戎加持的下一代 Serverless 函数计算与编排服务,结合 FinOps 等技术理念,持续为用户提供经济型 Serverless 服务。
相关文章:

云原生之深入解析基于FunctionGraph在Serverless领域的FinOps的探索和实践
一、背景 Serverless 精确到毫秒级的按用付费模式使得用户不再需要为资源的空闲时间付费。然而,对于给定的某个应用函数,由于影响其计费成本的因素并不唯一,使得用户对函数运行期间的总计费进行精确的事先估计变成了一项困难的工作。以传统云…...

电子电器架构(E/E)演化 —— 主流主机厂域集中架构概述
电子电器架构(E/E)演化 —— 主流主机厂域集中架构概述 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。…...

Python常用的几个函数
print()函数:用于打印输出信息到控制台。 input()函数:用于从控制台获取用户输入。 len()函数:用于获取字符串、列表、元组、字典等对象的长度。 range()函数:用于生成一个整数序列,常用于循环中。 type()函数&…...

【Linux系统基础】(2)在Linux上部署MySQL、RabbitMQ、ElasticSearch等各类软件
实战章节:在Linux上部署各类软件 前言 为什么学习各类软件在Linux上的部署 在前面,我们学习了许多的Linux命令和高级技巧,这些知识点比较零散,同学们跟随着课程的内容进行练习虽然可以基础掌握这些命令和技巧的使用,…...

HarmonyOS4.0系统性深入开发01应用模型的构成要素
应用模型的构成要素 应用模型是HarmonyOS为开发者提供的应用程序所需能力的抽象提炼,它提供了应用程序必备的组件和运行机制。有了应用模型,开发者可以基于一套统一的模型进行应用开发,使应用开发更简单、高效。 HarmonyOS应用模型的构成要…...

线下终端门店调研包含哪些内容
品牌渠道一般分为线上和线下,线上的价格、促销信息、店铺优惠机制等都可以通过登录查看,但是线下门店的数据则需要进店巡查,否则无法得到真实的店铺销售数据,当然也有品牌是靠线下的业务团队报备机制获得这些信息,但是…...

倾斜摄影三维模型数据在行业应用分析
倾斜摄影三维模型数据在行业应用分析 倾斜摄影三维模型数据是一种重要的地理信息资源,可以广泛应用于各个行业和场景,以解决不同领域的问题。以下将详细探讨几个典型的行业或场景,它们利用倾斜摄影三维模型数据解决问题的应用。 1、地理测绘…...

Apache Flink 进阶教程(七):网络流控及反压剖析
目录 前言 网络流控的概念与背景 为什么需要网络流控 网络流控的实现:静态限速 网络流控的实现:动态反馈/自动反压 案例一:Storm 反压实现 案例二:Spark Streaming 反压实现 疑问:为什么 Flink(bef…...

k8s学习 — (DevOps实践)第十三章 DevOps 环境搭建
k8s学习 — (DevOps实践)第十三章 DevOps 环境搭建 学习资料1 Gitlab1.1 安装 Gitlab1.2 页面配置1.3 配置 Secret1.4 为项目配置 Webhook1.5 卸载 2 Harbor2.1 安装 Harbor2.1 配置 Secret 3 SonarQube3.1 安装 SonarQube3.2 生成服务 token3.3 创建 We…...

Java_Stream流
一、JDK8新特性(Stream流) 接下来学习一个全新的知识,叫做Stream流(也叫Stream API)。它是从JDK8以后才有的一个新特性,是专业用于对集合或者数组进行便捷操作的。有多方便呢?我们用一个案例体…...

delphi中,tstringlist使用方法示例
delphi中,tstringlist使用方法示例 在 Delphi 中,TStringList 是一个常用的字符串列表类,它提供了许多用于处理字符串列表的方法。以下是一个示例,演示了如何在 Delphi 中使用 TStringList 类: program TStringListEx…...

【飞凌 OK113i-C 全志T113-i开发板】视频编解码测试
前言 本文测试OK113i-S开发板-视频编解码的功能 OK113i-S开发板是支持视频的编解码的,下面是官方介绍的编解码功能 T113-i 是一种为多媒体解码平台设计的高级应用处理器。T113-i 集成了64位玄铁C906 RISC-V CPU, 双核 Cortex - A7 CPU 和 HiFi4 DSP&a…...

全部没有问题 (一.5)
java mooc练习 基础练习: 进阶练习: final 赋值一次 局部 必须赋值 抽象类 多态测试 package com.book;public class moocDraft1 {static int variable1;public void fatherMethod(moocDraft1 a){System.out.println(variable);}public static void…...

C++归并排序详解以及代码实现
1. 介绍 归并排序(Merge Sort)是一种采用分治法(Divide and Conquer)策略的排序算法。该算法首先将已有序的子序列合并,得到完全有序的序列。在归并排序中,合并操作是将两个有序表合并成一个有序表的过程。…...

springboot整合JPA 多表关联 :一对多 多对多
补充一下自定义SQL 这是连表查询,可以任意查出字符,用Map接收 Testvoid test3() {JPAQueryFactory jpaQueryFactory new JPAQueryFactory(em);QStudent student QStudent.student;QMessage message QMessage.message;//constructor(StuMesDto.class, …...

Python 数据分析 Matplotlib篇 plt.rcParams 字典(第5讲)
Python 数据分析 Matplotlib篇 plt.rcParams字典(第5讲) 🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…...

DeamonSet详解
目录 1.1 何为DaemonSet 1.2 DaemonSet 的 API 对象的定义 1.3 DaemonSet实践 1.3.1 创建 DaemonSet 对象 1.3.2 查看 DaemonSet 对象 1.3.3 DaemonSet 版本管理 1.3.4 DaemonSet 的容器镜像版本到 v2.2.0 1.1 何为DaemonSet 介绍DaemonSet我们先来思考一个问题&#x…...

TwIST算法MALTLAB主程序详解
TwIST算法MALTLAB主程序详解 关于TwIST算法的具体原理可以参考: 链接: https://ieeexplore.ieee.org/abstract/document/4358846 链接: https://blog.csdn.net/jbb0523/article/details/52193209 该算法的MATLAB源代码: 链接: http://www.lx.it.pt/~bi…...

Flutter 三: Dart
1 数据类型 数字(number) int double 字符串转换成 num int.parse(“1”) double.parse(“1”);double 四舍五入保留两位小数 toStringAsFixed(2) 返回值为stringdouble 直接舍弃小数点后几位的数据 可使用字符串截取的方式 字符串(string) 单引号 双引号 三引号三引号 可以输…...

redis基本用法学习(C#调用FreeRedis操作redis)
FreeRedis属于常用的基于.net的redis客户端,EasyCaching中也提供适配FreeRedis的包。根据参考文献4中的说法,FreeRedis和CsRedis算是近亲(都是GitHub中账号为2881099下的开源项目),因此其用法特别相似。FreeRedis的主要…...

Postman接口测试(超详细整理)
常用的接口测试工具主要有以下几种 Postman:简单方便的接口调试工具,便于分享和协作。具有接口调试,接口集管理,环境配置,参数化,断言,批量执行,录制接口,Mock Server, …...

【深入解析spring cloud gateway】12 gateway参数调优与分析
本节主要对网关主要的一些参数做一些解释说明,并用压测工具测试一下网关的接口,通过压测来验证参数配置是否合理 一、连接池参数 参数示例 spring:application:name: gatewaycloud:gateway:# http连接设置httpclient:# 全局的响应超时时间,…...

Java继承,父类没有无参构造方法时,子类必须要显式调用父类的构造方法
在Java中,如果一个类没有定义任何构造函数,那么编译器会默认为这个类提供一个无参的构造函数。 这个隐式的构造函数在继承的时候,子类会在自己的构造方法里面默认的调用这个构造函数。 但是,如果我们在父类中定义了一个有参构造…...

Ubuntu 20.04使用Livox Mid-360
参考文章: Ubuntu 20.04使用Livox mid 360 测试 FAST_LIO-CSDN博客 一:Livox mid 360驱动安装与测试 前言: Livox mid360需要使用Livox-SDK2,而非Livox-SDK,以及对应的livox_ros_driver2 。并需要修改FAST_LIO中部…...

C语言之冒泡排序
其实排序有很多的方法,比如:冒泡排序,插入排序,快速排序,归并排序,选择排序等。今天来讲一下最简单的排序:冒泡排序。这种排序的方法效率极其低下。 假设有一个整型数组: int arr[…...

在Linux上安装NVM(Node Version Manager)
在Linux系统上,使用NVM(Node Version Manager)是管理和切换Node.js版本的一种便捷方式。以下是在Linux上安装NVM的步骤: 1. 下载并安装NVM 使用curl或wget下载并运行NVM的安装脚本。选择一种方式执行以下命令之一: …...

常用两种Linux命令生成器
在Linux中,可以使用多种命令来生成随机密码。以下是其中两种常用的命令: 1.pwgen:这个命令可以生成随机、无意义的但容易发音的密码。生成的密码可以只包含小写字母、大小写混合或数字。大写字母和数字会以一种便于记忆的方式放置࿰…...

【OAuth2】授权框架的四种授权方式详解
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《OAuth 2》。🎯🎯 …...

AI数字人不间断直播是什么?数字人直播带货如何搭建?
随着电商行业的崛起,数字人直播成为了最为热门的直播方式之一。数字人直播利用AI技术创建出的数字人进行直播,给观众带来了全新的视觉体验。 一、AI数字人无限播(数字人SaaS系统VX:zhibo175)是什么? AI数字…...

真菌基因组研究高分策略(二):比较基因组揭示寄主外生菌根真菌基因组的动态进化
在表征外生菌根(ECM)真菌的“共生工具包”方面的研究已经取得了重大进展,但宿主特异性如何被编码到ECM真菌基因组中仍知之甚少。2021年发表于《New Phytologist》期刊的文章对ECM真菌宿主特异性和通用性进行了比较基因组分析,重点…...