函数计算为您提供按量模式和预留模式两种实例使用模式。您可以根据两种模式对应的实例总数及实例扩容速度的限制信息配置对应的弹性伸缩规则。在预留模式下,您可以通过定时修改限制和根据指标修改限制两种方式解决预留实例利用不充分的问题。
实例伸缩限制
配置按量模式实例的伸缩限制
在处理函数调用请求时,函数计算会优先使用已有的可用实例。若当前实例已经满载,函数计算会创建新的实例来处理请求。随着调用请求量的增加,函数计算会持续创建新的实例,直到有足够的实例处理请求或者达到您设置的实例数上限。在实例扩容的过程中,将受到以下限制。
处于执行状态的实例总数,默认限制为每个地域300个。
处于执行状态的实例数的扩容速度,受突增实例数和实例增长速度的限制。不同地域的限制条件,请参见各地域扩容速度限制。
突增实例数:可立即创建的实例数,默认限制为100~300个。
实例增长速度:超过突增实例数后每分钟可增加的实例数,默认限制为100~300个。
当实例总数或者实例扩容速度超过限制后,函数计算将返回流控错误(HTTP Status
为429
)。下图展示在一个调用量快速增长的场景下,函数计算的流控行为。
图示中①:在达到突增实例数前,函数计算立即创建实例,这个过程中有冷启动,但没有流控错误。
图示中②:达到突增实例数后,实例数的增长受速度限制,部分请求会收到流控错误。
图示中③:实例数超过限制后,部分请求收到流控错误。
默认情况下,一个阿里云账号在同一个地域下的所有函数共享上述伸缩限制。当需要限制某个函数的实例数时,您可以配置函数级按量实例伸缩控制。配置后,当此函数处于执行状态的函数实例总数超过限制后,函数计算将返回流控错误。
配置预留模式实例的伸缩限制
当突发的调用量较大时,大量的实例创建会受到流控限制导致请求失败,实例的冷启动也会增加请求延时。为避免这些问题,您可以使用函数计算的预留实例,即提前准备好函数实例。预留实例的实例数上限和扩容速度有单独的限制,不受上述实例伸缩限制的影响。
预留实例总数:默认每个地域300个。
预留实例扩容速度:默认每分钟100~300个实例,不同地域的限制不同。具体信息,请参见各地域扩容速度限制。下图展示和上面相同的负载场景下,使用预留实例后函数计算的流控行为。
图示中①:在预留实例被用满之前,请求立即被执行,这个过程既没有冷启动,也没有流控错误。
图示中②:在预留实例被用满后,按量实例达到突增实例数之前,函数计算立即创建实例,这个过程中有冷启动,但没有流控错误。
各地域扩容速度限制
地域 | 实例扩容速度限制-突增实例数 | 实例扩容速度限制-实例增长速度 |
华东1(杭州)、华东2(上海)、华北2(北京)、华北3(张家口)、华南1(深圳) | 300 | 300/分钟 |
其他 | 100 | 100/分钟 |
相同地域下,预留模式和按量模式的扩容速度限制一致。
如果您对弹性速度有更高的需求,请加入钉钉用户群(钉钉群号11721331)申请。
GPU实例的扩容速度小于弹性实例,建议配合预留模式使用。
配置弹性伸缩规则
创建弹性伸缩规则
- 登录函数计算控制台,在左侧导航栏,单击服务及函数。
- 在顶部菜单栏,选择地域,然后在服务列表页面,单击目标服务。
- 在函数管理页面,单击目标函数名称。
在函数详情页面,选择弹性管理页签,然后单击创建规则。
在创建弹性伸缩限制规则页面,设置相关配置项,然后单击创建。
配置按量模式实例伸缩
最小实例数设置为0,最大实例数即按量实例的最大个数。如果没有配置最大实例数,最大实例数限制将遵循您的账号和目前所在地域的最大实例数限制。
说明闲置模式、定时修改限制、根据指标修改限制都是在预留模式下生效。
配置预留模式实例伸缩
配置项
说明
基础配置
版本或别名
选择需要创建预留模式实例的版本或别名。
说明仅支持在LATEST版本创建预留模式实例,其他版本暂不支持。
最小实例数
填写预留模式的实例的个数。最小实例数=预留实例个数。
说明通过限制函数级别最小实例数来快速响应函数调用请求,降低冷启动的发生次数,为时延敏感的在线业务提供更好的服务响应。
闲置模式
选择启用或关闭闲置模式,默认关闭。取值说明如下:
启用该功能后,仅在处理请求期间为预留模式的实例分配vCPU,其余时间实例的CPU将被冻结。
开启闲置模式时,函数计算会根据函数的单实例并发度优先将请求分配至同一个实例,直到该实例请求已满载。假设函数的单实例并发度为50,您有10个闲置的预留实例,当函数计算同时收到40个请求时,这40个请求将都由其中1个实例处理,只有这1个实例会从闲置进入活跃状态。
关闭该功能后,预留模式的实例无论是否正在处理请求都会分配vCPU。
最大实例数
填写最大实例数。最大实例数=预留实例个数+按量实例的最大个数。
说明通过限制函数级别最大实例数来防止单个函数过度调用导致的实例占用,保护后端资源,避免预期外的费用开销。
如果此配置项留空,最大实例数限制将遵循您的账号和目前所在地域的最大实例数限制。
(可选)定时修改限制:设置定时伸缩可以更加灵活地配置预留的函数实例,将指定时间下预留的函数实例量设定为指定的值,更好地贴合业务的并发量需求。配置原理及示例请参见定时修改限制。
策略名称
填写自定义的策略名称。
最小实例数
按需设置预留数量。
定时表达式(UTC)
定时信息,本文示例为cron(0 0 20 * * *)。详细信息,请参见参数说明。
生效时间(UTC)
设置定时弹性伸缩的开始生效及结束生效时间。
(可选)根据指标修改限制:根据实例的各指标利用率或预留实例并发利用率,每分钟对预留资源进行一次伸缩。配置原理及示例请参见根据指标修改限制。
策略名称
填写自定义的策略名称。
最小实例数范围
按需设置最小实例数的最小值和最大值。
利用率类型
仅当函数的实例类型为GPU实例时,此配置项有效。选择根据利用率设置弹性伸缩策略的指标类型。关于GPU实例的弹性伸缩策略,请参见GPU预留模式的弹性伸缩策略。
并发利用率阈值
设置伸缩范围。当实例的各指标利用率或预留实例并发利用率低于此配置项设置的值,则进行缩容,当实例的各指标利用率或预留实例并发利用率高于此配置项设置的值,则进行扩容。
生效时间(UTC)
设置指标弹性伸缩的开始生效及结束生效时间。
创建完成后,在规则列表,您可以看到目标函数下配置的预留模式的实例情况。
修改或删除弹性伸缩规则
在弹性管理页面,您可以查看创建的规则列表。您可以单击目标规则对应的操作列的编辑或者删除,修改或删除相应的弹性伸缩规则。
如果需要删除预留模式的实例,将最小实例数设置为0即可。
预留模式的弹性伸缩方式
由于预留模式配置的固定预留值会导致预留函数实例利用不充分,您可以通过定时修改限制和根据指标修改限制两种方式解决该问题。
定时修改限制
定义:通过定时弹性伸缩您可以更加灵活地配置预留的函数实例,在指定时间将预留的函数实例量设定成需要的值,使函数实例量更好地贴合业务的并发量。
适用场景:函数有明显的周期性规律或可预知的流量高峰。当函数调用并发大于定时预留值时,超出的部分会分配至按量模式的函数实例。
配置示例:如下图配置两个定时操作。在函数调用流量到来前,通过第一个定时配置将预留函数实例扩容至较大的值;当流量减小后,通过第二个定时配置将预留函数实例缩容到较小的值。
参数示例如下。为服务service_1的函数function_1配置定时伸缩,配置的生效区间为2022-11-01 10:00:00至2022-11-30 10:00:00,在每天20:00将预留函数实例扩容至50,在每天22:00再将预留函数实例收缩至10。在使用PutProvisionConfig API配置定时伸缩的请求参数可参考以下信息。
{
"ServiceName": "service_1",
"FunctionName": "function_1",
"Qualifier": "alias_1",
"ScheduledActions": [
{
"Name": "action_1",
"StartTime": "2022-11-01T10:00:00Z",
"EndTime": "2022-11-30T10:00:00Z",
"TargetValue": 50,
"ScheduleExpression": "cron(0 0 20 * * *)"
},
{
"Name": "action_2",
"StartTime": "2022-11-01T10:00:00Z",
"EndTime": "2022-11-30T10:00:00Z",
"TargetValue": 10,
"ScheduleExpression": "cron(0 0 22 * * *)"
}
]
}
参数说明如下。
参数 | 说明 |
Name | 配置的定时任务名称。 |
StartTime | 配置开始生效的时间,UTC格式。 |
EndTime | 配置结束生效的时间,UTC格式。 |
TargetValue | 目标值。 |
ScheduleExpression | 定时信息,支持两种格式:
|
Cron表达式(Seconds Minutes Hours Day-of-month Month Day-of-week)的字段说明如下。
字段名 | 取值范围 | 允许的特殊字符 |
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 | , - * ? |
字符名 | 定义 | 示例 |
* | 表示任一,每一。 | 在 |
, | 表示列表值。 | 在 |
- | 表示一个范围。 | 在 |
? | 表示不确定的值。 | 与其他指定值一起使用。例如,如果指定一个特定的日期,但您不在乎它是星期几,那么在 |
/ | 表示一个值的增加幅度,n/m表示从n开始,每次增加m。 | 在 |
根据指标修改限制
定义:通过追踪监控指标实现对预留模式的函数实例进行动态伸缩。
适用场景:函数计算系统周期性采集预留的函数实例并发利用率或实例的资源利用率指标,使用指标并结合您配置的扩容触发值、缩容触发值来控制预留模式函数实例的伸缩,使预留的函数实例量更好的贴合资源的真实使用量。
实现原理:指标追踪弹性伸缩根据指标情况每分钟对预留资源进行一次伸缩。
当指标超过扩容阈值时,开始以积极的策略扩容预留模式的函数实例量,最快速度将函数实例量扩容至目标值。
当指标低于缩容阈值时,开始以保守的策略缩容预留模式的函数实例量,小幅度向缩容目标值贴近。
如果在系统中设置了伸缩最大值和最小值,此时预留的函数实例量会在最大值与最小值之间进行伸缩,超出最大值时将停止扩容,低于最小值时将停止缩容。
配置示例:如下图以预留实例利用率指标伸缩为例。
当流量不断增加时,触发扩容阈值,预留模式的函数实例开始扩容,当达到设置的最大值时停止扩容,超出部分的请求分配至按量模式函数实例。
当流量不断减小时,触发缩容阈值,预留模式的函数实例开始缩容。
预留模式函数实例的并发利用率只统计预留模式的并发情况,不包含按量模式的数据。
指标口径:预留模式函数实例正在响应的请求并发值与所有预留函数实例最大可响应并发值的占比,数值范围为[0,1]。
对于不同的实例并发数,预留模式的函数实例最大可响应并发值的计算逻辑如下所示。关于实例并发数的具体信息,请参见设置实例并发度。
单实例单并发:最大可响应并发值=函数实例数量
单实例多并发:最大可响应并发值=函数实例数量×单实例并发度
扩缩容目标值
根据当前指标值、指标追踪值、当前预留模式的函数实例数、缩容系数共同决定。
扩缩容计算原理:缩容时会通过缩容系数来实现相对保守的缩容过程,缩容系数取值范围为(0,1]。缩容系数为系统参数,用于减缓缩容速度,防止缩容过快,您无需设置。扩缩容目标值对计算结果向上取整得到最终结果,计算逻辑如下。
扩容目标值=当前预留模式的函数实例数×(当前指标值/指标追踪值)
缩容目标值=当前预留模式的函数实例数×缩容系数×(1-当前指标值/指标追踪值)
扩容目标值计算示例:当前指标值为80%,指标追踪值为40%,当前预留模式的函数实例数为100,经过计算100×(80%/40%)=200。预留模式的函数实例数会扩容到200,以保证扩容后指标追踪值维持在40%附近。
参数示例如下。为service_1的function_1函数配置指标追踪弹性伸缩,配置的生效区间为:2022-11-01 10:00:00至2022-11-30 10:00:00,追踪预留模式函数实例并发利用率ProvisionedConcurrencyUtilization指标,并发利用率追踪值为60%,超过60%时开始扩容,扩容上限为100;并发利用率低于60%时开始缩容,缩容下限为10。在使用PutProvisionConfig API配置定时伸缩的请求参数可参考以下信息。
{
"ServiceName": "service_1",
"FunctionName": "function_1",
"Qualifier": "alias_1",
"TargetTrackingPolicies": [
{
"Name": "action_1",
"StartTime": "2022-11-01T10:00:00Z",
"EndTime": "2022-11-30T10:00:00Z",
"MetricType": "ProvisionedConcurrencyUtilization",
"MetricTarget": 0.6,
"MinCapacity": 10,
"MaxCapacity": 100,
}
]
}
参数说明如下。
参数 | 说明 |
Name | 配置的指标任务名称。 |
StartTime | 配置开始生效的时间,UTC格式。 |
EndTime | 配置结束生效的时间,UTC格式。 |
MetricType | 追踪的指标:ProvisionedConcurrencyUtilization。 |
MetricTarget | 指标的追踪值。 |
MinCapacity | 扩容的最大值。 |
MaxCapacity | 缩容的最小值。 |