背景
云函数(Serverless Cloud Function,SCF)是腾讯云为企业和开发者们提供的无服务器执行环境,帮助您在无需购买和管理服务器的情况下运行代码。您只需使用平台支持的语言编写核心代码并设置代码运行的条件,即可在腾讯云基础设施上弹性、安全地运行代码。SCF 是实时文件处理和数据处理等场景下理想的计算平台。
在触发云函数运行的时候,会出现超时的情况,这个时候如果我们的超时时间原本就设置的比较长,那么需要对整个函数执行情况进行排查,进一步分析超时的原因。
问题排查原因及解决方案
我们看先下SCF的基本架构,如下图所示:
云函数实质上就是一个运行在容器中的程序,仅仅在被调用的时候借用容器运行,调用完毕后容器则被云函数底层管理组件收回或者销毁。而部署在cvm或者ccs的线上业务则是长期运行在被部署环境中。
服务模型有两种:常驻进程型和用完即毁型。常驻进程型是为了适应传统 MVC 架构设计的,它看起来并不自然;如果你从现在开始玩 FaaS 的话,当然首选推荐用完即毁型,它可以最大限度发挥 FaaS 的优势。
函数运行时间分析
从上图我们可以看出,整个云函数的触发执行分位2大部分,第一部分是函数执行环境准备阶段。这里包含容器资源的调度,执行函数的下载,以及容器的启用。另一个分时间指的是函数的运行阶段,主要包含函数的初始化和函数具体执行阶段。
所以当我们触发一个云函数执行出现超时的情况时候,我们需要从如下几个方面进行分析:
1、函数执行环境准备阶段耗时。
在这个准备阶段可能会遇到资源调度异常问题,下载代码缓慢,启动容器失败的情况,都会导致整个函数运行超时。这个过程我们也称之为冷启动环节。
冷启动:简单概率来说,就是云函数运行容器创建到下载代码并解压挂载并启动容器
的过程。云函数的冷启动时间跟函数绑定的layer包以及代码包的大小呈现正 相关。一般情况下,云函数冷启动时间为1s,这里指的一般情况就是借取容 器过程正常并且解压后代码包于layer大小适度(个人经验解压后代码包大小在30到40兆内,冷启动时间在1s左右),所以这里需要看下。
热启动:简单概括来说,就是云函数的容器被预留后,下一次调用时直接从预留容器 中借取容器运行的过程
那么,冷启动是否可以消除?答案是不可以。当我们每次对函数配置与代码进行更改,那么就意味这云函数的运行环境与代码发生了变化,因此就需要重新创建容器进行配置的重新加载与代码包的重新挂载。既然我们不可以消除冷启动,那么可以降低冷启动的频率么?云函数拥有容器保留重用机制可以降低冷启动概率,但无论如何,更新函数后的冷启动都是无可避免的。
2、 函数执行阶段耗时。
函数在内部执行过程中,可能会与数据库、第三方网站产生交互,由于第三方请求会导致函数运行比较缓慢。 解决办法是将超时时间设置为一个较大值(不超过900均可),如果排查上述问题,仍然出现超时,需要检查下代码 log 中是否存在过大的输入数据和计算量、无法跳出的循环、长时间的 sleep 等。
云函数错误的排查定位思路
由用户侧造成的调用错误一般来可以通过调整输入参数与函数配置以及排查代码来解决。以下列出的几种示例仅是排查思路,并不代表能够覆盖所有的case。
例如:
1. 406: 用户上传的参数size过大,云函数的入参限制为6M,此错误较常发生在invoke云api调用。(控制台函数代码页面的"测试"选项就是调用invoke接口)。
2. 433: 云函数执行时长超时,如用户代码中不涉及远程调用,则让用户适当配置函数的超时时长即可;如用户代码中包含远程调用还需要确定是否为网络阻塞等问题,需要具体分析;另外433错误还可引发apigw触发函数的504错误,由于apigw侧等待后端服务返回结果是有timeout时间的。
3. 430: 用户代码执行错误。这边有一个边界问题,对于此类错误,最多帮用户定位到代码bug,原则上不帮助用户进行代码修复。
4. 434: 内存超限,适当调大云函数的运行内存。关于如何确定适当的运行内存有一个简单的方法,可以先将函数的配置内存调大,在控制台测试函数后,查看运行日志中的内存占用量,多次测试取一个合理的内存大小值。
以上就是在在触发云函数运行过程中,出现执行超时以及其他错误的一些排查思路供大家参考。