函数计算提供实例级别的事件,通过实例级别事件您可以了解函数实例完整的生命周期,包括实例构建、销毁的流程以及其中各步骤发生的时间点。本文介绍函数实例的生命周期以及实例级别事件的定义、转移流程、类型和查询方式。
函数实例的生命周期
函数实例会根据函数当前的请求调用量动态地按需构建与销毁,每个函数实例的生命周期包括实例构建(Creating)、请求调用(Invoke)和实例销毁(Destroy)三个阶段,如下图所示。
实例构建(Creating)
实例构建是指函数计算根据您的函数配置为您创建函数实例。在实例构建阶段,函数计算会按照顺序执行以下三项任务:
实例创建(Instance Create),包括加载代码、层加载或拉取镜像和启动实例。
运行时启动(Runtime Init)。
执行函数配置的Initializer回调(Init Hook)。更多信息,请参见Initializer回调。
实例构建阶段示意图如下所示。
实例构建一般在以下两种情况下发生。
弹性扩容
收到调用请求时,若当前的函数实例已经满载,会构建新的实例来处理请求,并立即执行实例构建流程,紧接着就会执行请求调用流程。弹性扩容可能会造成冷启动,解决方法请参见函数计算冷启动优化最佳实践。
预留配置调整
如果您配置了预留实例,对于这些预留实例,函数计算立即启动实例构建流程。如果当前未收到调用请求,则后续的请求调用流程会与实例构建流程相隔较长时间。更多信息,请参见配置预留实例。
对于一个函数实例,函数配置的Initialize回调方法只会执行一次,如果执行失败,会重新启动一个函数实例执行Initializer流程,Initializer回调失败的实例会直接销毁。
请求调用(Invoke)
实例运行期间,会调用您的函数处理程序以处理来自内外部的函数调用请求。在调用阶段,对于函数计算支持的标准运行时,一个实例在同一时间只会处理一个请求;对于自定义运行时或自定义容器运行时,一个实例在同一时间可以处理多个请求。您可以通过设置单实例多并发实现,具体操作,请参见设置单实例并发度。
函数计算只在实际请求和回调程序执行时计费,在请求以外的时间段内实例会被冷冻,因此不计费,详情请参见计费说明。
实例销毁(Destroy)
如果函数实例在一段时间内没有收到任何调用,则触发此阶段。在销毁阶段,函数计算会先执行PreStop回调方法。您可以在PreStop回调方法中执行一些清理任务。
实例销毁一般在以下三种情况下发生。
实例闲置:如果实例在一段时间内没有收到任何调用请求,函数计算会自动回收该实例。
预留配置调整:当您缩减预留实例数量时,函数计算会立即为您销毁多余的实例。
实例异常:如果实例在构建或运行阶段出现了异常,函数计算会销毁该实例。
实例冻结机制
在没有调用请求时,函数计算会将实例冻结(Freeze),当新的请求来到时,函数计算会将实例解冻(Thaw)。如下图所示。
实例冻结主要发生在以下两种情况。
实例初始化阶段完成后,调用阶段前。
函数某一次调用阶段结束后,下一次调用阶段前。
在一次调用阶段完成后,函数计算将冻结函数实例,程序中的后台进程、线程或协程无法继续运行,异步日志也可能没有写入成功。
什么是实例级别事件
事件是一种描述资源状态变化的数据记录。实例是函数计算为执行您的请求而构建的核心资源,函数计算系统会动态地构建与销毁实例,从而弹性地处理您的请求。函数计算将您的实例发生各个重要状态变化的时间点定义为各类事件,并支持在实例详情页面进行可视化展示。通过实例级别事件,您不仅可以观察到实例的生命周期,还可以快速定位由实例导致的请求执行异常。
事件的相关状态和转移流程
事件标记了资源状态变化的时间点,因此每种事件分别至少与一种可定义的前置状态和后置状态相关。
函数实例的状态转移以及相关事件示意图如下所示。
函数实例的状态如下所示。状态转移相关事件的详细信息,请参见事件类型。
Creating:您的实例正在构建中。实例会根据函数当前的请求调用量动态地按需构建,该状态包含以下子状态。
镜像拉取(ImagePulling):正在拉取您的镜像(Custom Container运行环境)。
代码加载(CodePreparing):正在拉取并挂载您的代码包。
层加载(LayerPreparing):正在拉取并挂载您的层。
运行时启动(RuntimeInitializing):正在启动您的实例并进行健康检查。
Initializer执行(Initializing):正在执行您的Initializer回调程序。
构建完成(Finished):您的实例构建完成。
构建失败(Failed):您的实例构建失败。
Running:您的实例正在运行中。此状态下的实例会处理函数的调用请求。
Destroyed:您的实例已经被销毁。实例会根据函数当前的请求调用量动态地按需销毁。
Error:您的实例当前不能正常处理调用请求,即将被销毁。
事件类型
事件名称 | 事件等级 | 事件含义 | 解决方案 |
实例构建中 fc:Instance:Creating | Normal | 函数计算开始为您的请求构建所需实例。 | 不涉及。 |
代码加载就绪 fc:Instance:PrepareCodeSuccess | Normal | 函数计算成功地将您的代码包拉取并挂载到实例中。 说明 函数计算针对代码包加载过程进行了多种优化,部分条件下,加载时间非常短。 | 不涉及。 |
代码加载失败 fc:Instance:PrepareCodeFailed | Warning | 函数计算未能成功地将您的代码包拉取并挂载到实例中。 | 请加入钉钉用户群(钉钉群号:64970014484)获取技术支持。 |
层加载就绪 fc:Instance:PrepareLayerSuccess | Normal | 函数计算成功地将层拉取并挂载到实例中。 说明 函数计算针对层加载过程进行了多种优化,部分条件下用时极短,且与代码加载同时进行。 | 不涉及。 |
层加载失败 fc:Instance:PrepareLayerFailed | Warning | 函数计算未能成功地将层拉取并挂载到实例中。 | 请加入钉钉用户群(钉钉群号:64970014484)获取技术支持。 |
镜像准备就绪 fc:Instance:PullImageSuccess | Normal | 函数计算已成功拉取您的Custom Container实例镜像。 | 不涉及。 |
镜像准备失败 fc:Instance:PullImageFailed | Warning | 函数计算未能成功拉取您的Custom Container实例镜像。 | 请加入钉钉用户群(钉钉群号:64970014484)获取技术支持。 |
实例启动成功 fc:Instance:RuntimeInitializationSuccess | Normal | 函数计算已成功启动您的实例并完成了健康检查。 | 不涉及。 |
实例启动失败 fc:Instance:RuntimeInitializationFailed | Warning | 函数计算发现您的实例在启动后未能通过健康检查。 | 建议您参考实例日志并结合Custom Runtime错误排查方法解决该问题。关于Custom Runtime错误排查,请参见错误处理。 |
Initializer执行成功 fc:Instance:InitializationSuccess | Normal | 您的Initializer回调程序执行成功。 | 不涉及。 |
Initializer执行失败 fc:Instance:InitializationFailed | Warning | 您的Initializer回调程序执行失败。 | 建议您根据请求日志调整Initializer回调程序的逻辑。 |
实例构建成功 fc:Instance:CreateSuccess | Normal | 您的实例构建成功,即将开始处理调用请求。 | 不涉及。 |
实例构建失败 fc:Instance:CreateFailed | Warning | 您的实例构建失败,即将被销毁。 | 不涉及。 |
实例已销毁 fc:Instance:DestroySuccess | Normal | 您的实例已经被销毁。 | 不涉及。 |
查询实例级别事件
开启实例级别指标后,函数计算会收集实例的事件信息,该信息将被投递到您在配置日志时选择的日志仓库中。关于开启实例级别指标的具体操作,请参见配置实例级别指标。