函数计算为您提供了按量模式和预留模式两种实例使用模式。本文介绍两种实例使用模式的功能原理、计费方式、使用场景、实例伸缩限制以及如何在函数计算控制台配置预留模式实例和配置预留模式的弹性伸缩。
按量模式
按量模式是指函数实例的分配和释放完全由函数计算系统负责。函数计算会根据函数的调用量自动进行实例扩缩容,在调用增加时创建实例,在请求减少后销毁实例。整个过程完全自动,提高了资源利用率,同时极大地降低了您管理资源的难度。您的阿里云账号(主账号)在单个地域内默认的按量实例上限数为300。如果您需要提高该限制,请提交工单申请。
计费方式:只有发生函数调用时才会产生费用,无函数调用请求就不会分配实例也不会产生费用。关于具体产品定价和计费,请参见计费概述。
预留模式
由于按量模式是通过请求自动触发实例的创建,当首次发起调用时需要等待实例冷启动,如果您希望消除冷启动延时的影响,可以通过配置预留模式来解决。预留模式是将函数实例的分配和释放交由您管理,当配置预留函数实例后,预留的函数实例将会常驻,直到您主动将其释放。函数计算会优先将函数调用请求调度至预留的函数实例,当函数请求的并发超过预留的函数实例处理能力时,超出部分的请求将会转发给按量模式的实例。

闲置计费(Beta)
默认情况下,闲置计费功能处于关闭状态,此时预留模式的实例无论是否正在处理请求,都会始终为其分配CPU,让实例始终处于活跃状态,以保证实例可以在无请求时正常运行后台任务。开启闲置计费功能后,当预留的实例无请求时,函数计算会将实例的CPU冻结,使该实例进入闲置状态,并以闲置实例资源单价计算使用成本。闲置实例资源使用单价是活跃实例资源使用单价的20%,这将帮助您节省大量的成本。更多信息,请参见计费概述。
使用场景
您可以根据不同的使用场景选择是否启用闲置计费功能。
- 使用成本
如果您需要预留模式来消除冷启动,又担心预留成本过高,建议启用闲置计费功能。此时,您只需为闲置状态的预留实例支付较少的费用,就能实现无冷启动的响应调用需求。
- 后台任务
如果您的函数需要运行后台任务,建议关闭闲置计费功能。例如:
- 使用依赖于内置调度或后台功能的应用框架,或依赖的中间件需要定期汇报心跳。
- 使用Go语言的Goroutin轻量级线程、Node.js语言的async函数或Java语言的异步线程执行异步操作。
实例伸缩限制
配置按量模式实例的伸缩限制
- 处于执行状态的实例总数,默认限制为每个地域300个。
- 处于执行状态的实例数的扩容速度,受突增实例数和实例增长速度的限制。不同地域的限制条件,请参见各地域扩容速度限制。
- 突增实例数:可立即创建的实例数,默认限制为100~300个。
- 实例增长速度:超过突增实例数后每分钟可增加的实例数,默认限制为100~300个。
HTTP Status
为429
)。下图展示了在一个调用量快速增长的场景下函数计算的流控行为:
- 在达到突增实例数前,函数计算立即创建实例,这个过程中有冷启动,但没有流控错误(图示中①)。
- 达到突增实例数后,实例数的增长受速度限制,部分请求会收到流控错误(图示中②)。
- 实例数超过限制后,部分请求收到流控错误(图示中③)。
默认情况下,一个阿里云账号在同一个地域下的所有函数共享上述伸缩限制。当需要限制某个函数的实例数时,您可以配置函数级按量实例伸缩控制。配置后,当此函数处于执行状态的函数实例总数超过限制后,函数计算将返回流控错误。
配置预留模式实例的伸缩限制
- 预留实例总数:默认每个地域300个。
- 预留实例扩容速度:默认每分钟100~300个实例(不同地域的限制不同)。下图展示了和上面相同的负载场景下,使用了预留实例后函数计算的流控行为:
- 在预留实例被用满之前,请求立即被执行,这个过程既没有冷启动,也没有流控错误(图示中①)。
- 在预留实例被用满后,按量实例达到突增实例数之前,函数计算立即创建实例,这个过程中有冷启动,但没有流控错误(图示中②)。
各地域扩容速度限制
地域 | 实例扩容速度限制-突增实例数 | 实例扩容速度限制-实例增长速度 |
---|---|---|
华东1(杭州)、华东2(上海)、华北2(北京)、华北3(张家口)、华南1(深圳) | 300 | 300/分钟 |
其他 | 100 | 100/分钟 |
- 相同地域下,预留模式和按量模式的扩容速度限制一致。
- 如果您对弹性速度有更高的需求,请提交工单申请。
- 性能实例和GPU实例的扩容速度小于弹性实例,建议配合预留模式使用。
配置预留实例
更新预留实例
配置预留模式的弹性伸缩
由于预留模式配置的固定预留值会导致预留函数实例利用不充分,您可以通过定时弹性伸缩和指标追踪弹性伸缩两种模式解决该问题。
定时弹性伸缩
- 定义:通过定时弹性伸缩您可以更加灵活地配置预留的函数实例,在指定时间将预留的函数实例量设定成需要的值,使函数实例量更好地贴合业务的并发量。
- 适用场景:如果您的函数有明显的周期性规律或可预知的流量高峰,可以使用定时预留功能来提前预留函数实例。当函数调用并发大于定时预留值时,超出的部分会分配至按量模式的函数实例。
- 配置示例:如下图配置了两个定时操作,在函数调用流量到来前,通过第一个定时配置将预留函数实例扩容至较大的值,当流量减小后,通过第二个定时配置将预留函数实例缩容到较小的值。
- 为service_1的function_1函数配置定时伸缩,配置的生效区间为:2020-11-01 10:00:00至2020-11-30 10:00:00,在每天20:00将预留函数实例扩容至50,在每天22:00再将预留函数实例收缩至10。
{ "ServiceName": "service_1", "FunctionName": "function_1", "Qualifier": "alias_1", "ScheduledActions": [ { "Name": "action_1", "StartTime": "2020-11-01T10:00:00Z", "EndTime": "2020-11-30T10:00:00Z", "TargetValue": 50, "ScheduleExpression": "cron(0 0 20 * * *)" }, { "Name": "action_2", "StartTime": "2020-11-01T10:00:00Z", "EndTime": "2020-11-30T10:00:00Z", "TargetValue": 10, "ScheduleExpression": "cron(0 0 22 * * *)" } ] }
- 参数说明如下:
参数 说明 Name 配置的定时任务名称。 StartTime 配置开始生效的时间,UTC格式。 EndTime 配置结束生效的时间,UTC格式。 TargetValue 目标值。 ScheduleExpression 定时信息,支持两种格式: - At expressions - "at(yyyy-mm-ddThh:mm:ss)":只调度一次,使用UTC格式。如:北京时间04月01日20:00开始调度,转换为UTC时间就是04月01日12:00开始调度,则可以使用
at(2021-04-01T12:00:00)
。 - Cron expressions - "cron(0 0 4 * * *)":调度多次,使用标准crontab格式,默认以UTC时间运行,即北京时间减去8个小时。如:北京时间每天20:00点进行调度,转化为UTC时间就是每天12:00进行调度,则可以使用
cron(0 0 12 * * *)
。
Cron表达式(Seconds Minutes Hours Day-of-month Month Day-of-week)的字段说明如下:表 1. 字段说明 字段名 取值范围 允许的特殊字符 Seconds 0~59 无 Minutes 0~59 , - * / Hours 0~23 , - * / Day-of-month 1~31 , - * ?/ Month 1~12或JAN~DEC , - * / Day-of-week 1~7或MON~SUN , - * ? 表 2. 特殊字符说明 字符名 定义 示例 * 表示任一,每一。 在 Minutes
字段中:0表示每分钟的0秒都执行。, 表示列表值。 在 Day-of-week
字段中:MON,WED,FRI表示星期一,星期三和星期五。- 表示一个范围。 在 Hours
字段中:10-12表示UTC时间从10点到12点。? 表示不确定的值。 与其他指定值一起使用。例如,如果指定了一个特定的日期,但您不在乎它是星期几,那么在 Day-of-week
字段中就可以使用。/ 表示一个值的增加幅度,n/m表示从n开始,每次增加m。 在 minute
字段中:3/5表示从3分开始,每隔5分钟执行。 - At expressions - "at(yyyy-mm-ddThh:mm:ss)":只调度一次,使用UTC格式。如:北京时间04月01日20:00开始调度,转换为UTC时间就是04月01日12:00开始调度,则可以使用
指标追踪弹性伸缩
- 定义:通过追踪监控指标实现对预留模式的函数实例进行动态伸缩。
- 适用场景:函数计算系统周期性采集预留的函数实例并发利用率指标,使用该指标并结合您配置的扩容触发值、缩容触发值来控制预留模式函数实例的伸缩,使预留的函数实例量更好的贴合资源的真实使用量。
- 实现原理:指标追踪弹性伸缩根据指标情况每分钟对预留资源进行一次伸缩。
- 当指标超过扩容阈值时,开始以积极的策略扩容预留模式的函数实例量,最快速度将函数实例量扩容至目标值。
- 当指标低于缩容阈值时,开始以保守的策略缩容预留模式的函数实例量,小幅度向缩容目标值贴近。
- 配置示例:
- 当流量不断增加时,触发扩容阈值80%,预留模式的函数实例开始扩容,当达到最大值100时停止扩容,超出部分的请求分配至按量模式函数实例。
- 当流量不断减小时,触发缩容阈值60%,预留模式的函数实例开始缩容。
- 单实例单并发:最大可响应并发值=函数实例数量
- 单实例多并发:最大可响应并发值=函数实例数量×单实例并发度
- 根据当前指标值、指标追踪值、当前预留模式的函数实例数、缩容系数共同决定。
- 扩缩容计算原理:缩容时会通过缩容系数来实现相对保守的缩容过程,缩容系数取值范围为(0,1]。缩容系数为系统参数,用于减缓缩容速度,防止缩容过快,您无需设置。扩缩容目标值对计算结果向上取整得到最终结果,计算逻辑如下:
- 扩容目标值=当前预留模式的函数实例数×(当前指标值/指标追踪值)
- 缩容目标值=当前预留模式的函数实例数×缩容系数×(1-当前指标值/指标追踪值)
- 扩容目标值计算示例:当前指标值为80%,指标追踪值为40%,当前预留模式的函数实例数为100,经过计算100×(80%/40%)=200。预留模式的函数实例数会扩容到200,以保证扩容后指标追踪值维持在40%附近。
- 为service_1的function_1函数配置指标追踪弹性伸缩,配置的生效区间为:2020-11-01 10:00:00至2020-11-30 10:00:00,追踪预留模式函数实例并发利用率ProvisionedConcurrencyUtilization指标,并发利用率追踪值为60%,超过60%时开始扩容,扩容上限为100;并发利用率低于60%时开始缩容,缩容下限为10。
{ "ServiceName": "service_1", "FunctionName": "function_1", "Qualifier": "alias_1", "TargetTrackingPolicies": [ { "Name": "action_1", "StartTime": "2020-11-01T10:00:00Z", "EndTime": "2020-11-30T10:00:00Z", "MetricType": "ProvisionedConcurrencyUtilization", "MetricTarget": 0.6, "MinCapacity": 10, "MaxCapacity": 100, } ] }
- 参数说明如下:
参数 说明 Name 配置的定时任务名称。 StartTime 配置开始生效的时间,UTC格式。 EndTime 配置结束生效的时间,UTC格式。 MetricType 追踪的指标:ProvisionedConcurrencyUtilization。 MetricTarget 指标的追踪值。 MinCapacity 扩容的最大值。 MaxCapacity 缩容的最小值。