AWS Lambda 任务在6.00秒后超时。

42
我正在使用无服务器框架。我的Lambda函数连接到DynamoDB表以更新表中的项目。表的读取和写入容量单位分别为5,自动缩放已禁用。AWS Lambda函数分配了128MB的内存。
我使用Jmeter进行性能测试。我同时发送了1000个请求,有些响应给出了完美的输出,而其他一些则给出了内部服务器错误(502 Bad Gateway)。我还分析了CloudWatch的日志,只得到了任务超时错误。有人能告诉我为什么会出现这个错误以及如何解决吗?

1
你的连接池中有多少个连接?也许连接池没有足够的连接,导致一些任务超时了? - Aniket Thakur
@Mike Dinescu的回答非常详细,但是以防万一,您使用的是哪个运行时?如果在node中,您可能需要设置context.callbackWaitsForEmptyEventLoop = falsehttp://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html - Justin Kruse
是的 @JustinKruse 我正在使用Node.js。 - darshi kothari
你能解决这个问题吗?我们不得不设置 context.callbackWaitsForEmptyEventLoop,这样我们就不必等待像网络事件或数据库连接这样的事情被清理干净才返回,否则我们总是会遇到这个6秒超时。 - Justin Kruse
1
是的 @JustinKruse,我已经通过增加 DynamoDB 的读写容量单位来解决了这个问题。 - darshi kothari
Lambda函数的最大执行时间限制为5分钟。实际限制在创建Lambda函数时进行配置。这个限制是因为Lambda函数旨在是小而快速的,而不是大型应用程序。您的错误消息显示“任务在15.00秒后超时”。这意味着AWS在任务运行了15秒后有意停止了任务。这与函数在执行什么操作或正在处理哪个文件无关。 - Korayem
2个回答

76

AWS Lambda函数使用Serverless框架时的默认超时时间为6秒。只需根据 文档 中的说明将其更改为较高的值即可:

functions:
  hello:
    ...
    timeout: 10 # optional, in seconds, default is 6

这只涉及(或回避)问题的一部分 - Mike Dinescu的答案更加全面:https://dev59.com/rFYN5IYBdhLWcg3wVm6n#47605576 - cellepo
@Dunedan,谢谢!我一直在为此苦苦挣扎。 - Gru

12

既然提到你的DynamoDB表只配置了5 WCU,这意味着每秒只允许5次写入。

DynamoDB确实提供了突发容量,允许您使用累积容量的300秒(在5 WCU的情况下相当于1500个总写请求),但是一旦这些用尽,它就会开始限制速率。

DynamoDB客户端内置自动重试功能,具有指数退避,并且足够智能地识别限流,因此如果被反复限制,单个写操作很容易需要几秒钟才能成功完成。

您的Lambda函数很可能在6秒超时,因为函数正在等待向DynamoDB的重试操作。

因此,在进行负载测试时,请确保所有依赖项都按比例缩放。在每秒1000个请求的情况下,您应该确保为您的DynamoDB表和/或索引适当分配读取/写入容量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接