非冷启动状态下AWS Lambda启动延迟10秒问题求助
Lambda非冷启动执行延迟超10秒问题排查与解决
问题背景
Node.js Lambda函数BalancerNoVPC通过自定义脚本每分钟第45秒触发调用,调用代码如下:
const command = new InvokeCommand({ FunctionName: "BalancerNoVPC", InvocationType: "Event", }); const response = await client.send(command); log.info("Req ID: " + response.$metadata.requestId);
调用返回StatusCode: 202,脚本日志显示调用按时完成:
2024-12-06T10:15:45: INFO { m: 'Invoking Lambda' } 2024-12-06T10:15:45: INFO { m: 'Req ID: 3dc0a16d-a77d-4449-a1ff-92fbab6a929e' } 2024-12-06T10:15:45: INFO { m: 'Sleeping for 59916 ms' }
但非冷启动状态下,函数执行延迟超10秒:冷启动时START事件在调用后1秒内触发,Init Duration为736.98ms;后续调用中,START事件延迟至调用后11秒触发,最终因30秒超时退出:
2024-12-06T10:15:56.195Z START RequestId: 3dc0a16d-a77d-4449-a1ff-92fbab6a929e Version: $LATEST 2024-12-06T10:16:15.166Z END RequestId: 3dc0a16d-a77d-4449-a1ff-92fbab6a929e 2024-12-06T10:16:15.166Z REPORT RequestId: 3dc0a16d-a77d-4449-a1ff-92fbab6a929e Duration: 30000.00 ms Billed Duration: 30000 ms Memory Size: 128 MB Max Memory Used: 93 MB Status: timeout
当前并发执行数约21次/分钟,远低于1000软限制,同步(InvocationType: "RequestResponse")和异步调用均存在该问题。
排查方向与解决方案
1. 优化内存配置,提升CPU资源
Lambda的CPU资源与内存配额正相关,128MB内存对应的CPU性能极低,可能导致调度排队、执行缓慢。
- 将函数内存调整至256MB或更高,观察
START事件触发延迟和执行时长变化。
2. 清理全局资源,避免容器复用阻塞
容器复用后,全局作用域的未释放资源(如数据库连接、定时器、未关闭的文件句柄)可能导致资源耗尽或逻辑阻塞:
- 检查函数全局代码,确保每次执行后释放所有资源,或在处理新请求前重置全局状态(如清除定时器、关闭闲置连接)。
- 示例:在函数处理逻辑开头添加资源清理代码:
// 重置全局定时器(如果存在) if (global.timer) { clearTimeout(global.timer); global.timer = null; } // 关闭闲置数据库连接 if (global.dbConnection) { await global.dbConnection.end(); global.dbConnection = null; }
3. 替换自定义调用脚本为CloudWatch EventBridge
自定义脚本的调度精度和可靠性不如AWS原生服务,可能存在隐性延迟:
- 使用CloudWatch EventBridge创建cron规则
45 * * * ? *,直接触发Lambda函数,避免自定义脚本的调度误差。
4. 检查Lambda调度指标
在CloudWatch控制台查看以下指标,确认是否存在隐性调度限制:
ConcurrentExecutions:确认实际并发数是否接近账户或函数级限制Throttles:检查是否存在调用被限流的情况InvocationDelay:查看从调用请求到函数START事件的时间差,确认是否为平台级调度延迟
5. 启用预配置并发(可选)
如果需要稳定的低延迟执行,配置预配置并发让Lambda保持warm容器,避免调度排队:
- 在Lambda控制台开启预配置并发,设置足够的容量覆盖每分钟21次的调用量。
内容的提问来源于stack exchange,提问作者DamiToma
相关产品推荐
相关产品推荐

