在函数计算中,应用所需的计算资源由平台负责管理。平台要能够识别应用特征,在负载快速上升时,及时扩容计算资源,保证应用性能稳定 ;在负载下降时, 及时缩容计算资源,加快资源在不同账户 / 函数间的流转,提高资源利用率。因此更实时、更主动、更智能的弹性伸缩是函数计算系统具备良好用户体验的关键。函数计算的资源伸缩过程是一个指标收集、在线决策、离线分析、决策优化的闭环。
系统收集多个维度的指标,既有节点维度的信息,包括 CPU、内存、网络资源 使用率、系统负载等;也有应用维度的信息,包括请求速率、函数实例启动延时、函数执行延时等。这些指标按照用户、函数、不同大小的时间窗口等被聚合,最终作为决策依据,被在线伸缩和流控算法使用。
随着平台规模的扩大,记录和聚合海量函数的信息在工程实现上面临较大的挑战。实践中,信息的处理代价和方式应当被仔细考量,以避免影响系统性能。比如, 统计 95 分位请求延时的成本较高,这类信息一般只在离线算法中使用,并通过统计算法计算近似的 95 分位信息,降低计算复杂度。
用户函数的调用通常是不均匀的,例如 1 秒内发生了 1000 次调用的函数,可能所有的调用请求都是在前 100 毫秒内发生的。如果所有请求都立即被响应,无疑需要在短时间内扩容更多的函数实例。待突发请求过后,很多函数实例又处于闲置状态。这样不但增加了系统压力,也降低了资源使用率。函数计算系统通过队列平滑负载毛刺的压力。函数调用请求首先在队列中排队,只有在有可用的函数实例后才被处理。系统按照如下的步骤计算所需的函数实例数。
(1)根据函数负载特点确定聚合请求数据的时间窗口,计算请求入队速率。对于 被密集调用的函数,数据聚合时间窗口不能太大,否则无法识别快速变化的负载,影响性能。对于被稀疏调用的函数,太小的聚合时间窗口可能聚合不到请求,没有意义。
(2)根据入队速率、队列长度、函数实例启动时长、实例生命周期、实例资源利用率等指标,计算期望的请求出队速率。
(3)根据出队速率及函数的执行时间,计算期望的函数实例数。
(4)对比已有实例数、正在启动的实例数和期望实例数,创建或销毁实例。
在创建新实例时,系统需要决定如何将函数实例放置在下层计算节点上。放置算法应当满足多方面的要求,如下图所示。
资料来源:《弹性计算—无处不在的算力》
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。