Aws lambda 偶尔AWS Lambda超时,但执行时间为次秒

Aws lambda 偶尔AWS Lambda超时,但执行时间为次秒,aws-lambda,Aws Lambda,我们有一个用Java编写的AWS Lambda,通常在大约200毫秒内完成。偶尔,它会在5秒后超时(我们配置的超时值) 我知道由于容器设置,偶尔会增加延迟(不过,我不清楚这是否会影响您的执行时间)。我添加了一些调试日志,看起来代码运行速度很慢 例如,一个特别值得注意的日志条目显示了对HttpClient的调用。createDefault通常需要不到200毫秒的时间(基于Lambda在不到200毫秒的时间内执行的事实),但当超时发生时,大约需要2-3秒 2017-09-14 16:31:28

我们有一个用Java编写的AWS Lambda,通常在大约200毫秒内完成。偶尔,它会在5秒后超时(我们配置的超时值)

我知道由于容器设置,偶尔会增加延迟(不过,我不清楚这是否会影响您的执行时间)。我添加了一些调试日志,看起来代码运行速度很慢

例如,一个特别值得注意的日志条目显示了对HttpClient的调用。createDefault通常需要不到200毫秒的时间(基于Lambda在不到200毫秒的时间内执行的事实),但当超时发生时,大约需要2-3秒

2017-09-14 16:31:28     DEBUG Helper:Creating HTTP Client
2017-09-14 16:31:31     DEBUG Helper:Executing request

除非我误解了什么,否则由于容器初始化引起的任何延迟似乎都已经发生了。我是否错误地认为代码执行不应该在一次执行到下一次执行的速度上有显著差异?或者这正是我们应该期待的吗?

试着让你的功能始终保持温暖,看看它是否会有所不同

如果超时确实是由于容器预热造成的,那么将其保持温暖将大大有助于减少这些超时的频率。在部署更改时,您仍然会遇到冷启动,但至少这是可以预测的


设置新容器或更换冷容器需要一些时间。这两项都与你的时间有关。您在控制台中看到的时间就是您的账单支付时间

我假设Amazon对容器的供应不收费,但他们肯定会在您的运行时启动时立即启动计时器。您可能需要支付SDK/JDK初始化和加载其类的时间。他们肯定不会因为启动承载集装箱的操作系统而向我们收费

运行两次显示新实例和重用实例的不同时间。第一个是
374.58
ms,第二个是
0.89
ms。在这之后,您会看到
400
100
ms的计费持续时间。对于第二个,容器被重复使用。正如@dashmug已经指出的那样,虽然您可以尝试保持容器温暖,但AWS偶尔会回收容器,并且随着负载的增加或减少,会生成新的容器。这些博客可能也值得一看。如果包含外部库,则时间会增加。如果你看看这个博客,你会发现Java和更小的内存分配通常会超过2-4秒

查看这些时间,您可能应该增加超时时间,不仅要查看应用程序提供的日志,还要查看实际超时事件的
开始
结束
报告
条目。每个正在运行的Lambda容器实例似乎都创建了自己的日志流。如果不经常调用,请考虑保持你的lambda温暖。

05:57:20 START RequestId: bc2e7237-99da-11e7-919d-0bd21baa5a3d Version: $LATEST 05:57:20 Hello from Lambda com.udoheld.aws.lambda.HelloLogSimple. 05:57:20 END RequestId: bc2e7237-99da-11e7-919d-0bd21baa5a3d 05:57:20 REPORT RequestId: bc2e7237-99da-11e7-919d-0bd21baa5a3d Duration: 374.58 ms Billed Duration: 400 ms Memory Size: 128 MB Max Memory Used: 44 MB 05:57:20启动请求ID:bc2e7237-99da-11e7-919d-0bd21baa5a3d版本:$最新版本 05:57:20你好,来自Lambda com.udoheld.aws.Lambda.HelloLogSimple。 05:57:20结束请求ID:bc2e7237-99da-11e7-919d-0bd21baa5a3d 05:57:20报告请求ID:bc2e7237-99da-11e7-919d-0bd21baa5a3d持续时间:374.58毫秒计费持续时间:400毫秒内存大小:128 MB最大使用内存:44 MB 05:58:01启动请求ID:d534155b-99da-11e7-8898-2dcaeed855d3版本:$最新版本 05:58:01你好,来自Lambda com.udoheld.aws.Lambda.HelloLogSimple。 05:58:01结束请求ID:d534155b-99da-11e7-8898-2dcaeed855d3
05:58:01报告请求ID:d534155b-99da-11e7-8898-2dcaeed855d3持续时间:0.89毫秒计费持续时间:100毫秒内存大小:128 MB最大已用内存:44 MB对于基于Java的应用程序,预热期更多,因为您知道它是jvm。最好使用NodeJS或Python,因为它们的预热时间更短。如果您没有以这种方式切换tech堆栈,只需通过触发它来保持容器温度,或者增加内存,这将减少执行时间,因为lambda cpu分配更多用于更大的内存

05:58:01 START RequestId: d534155b-99da-11e7-8898-2dcaeed855d3 Version: $LATEST 05:58:01 Hello from Lambda com.udoheld.aws.lambda.HelloLogSimple. 05:58:01 END RequestId: d534155b-99da-11e7-8898-2dcaeed855d3 05:58:01 REPORT RequestId: d534155b-99da-11e7-8898-2dcaeed855d3 Duration: 0.89 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 44 MB