偶尔的AWS Lambda超时,但以其他方式执行亚秒级

时间:2017-09-14 20:26:58

标签: aws-lambda

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

我知道由于容器设置偶尔会增加延迟(但是,我不清楚这是否会影响您的执行时间)。我添加了一些调试日志,似乎代码只是运行缓慢

例如,一个特别值得注意的日志条目显示对HttpClients.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

除非我误解了某些内容,否则由于容器初始化导致的延迟似乎已经发生。假设代码执行不应该在一次执行到下一次执行的速度上有显着差异,那我错了吗?或者这只是我们应该期待的事情?

3 个答案:

答案 0 :(得分:2)

设置新容器或更换冷容器需要一些时间。两者都与你的时间不符。您在控制台中看到的时间是您需要付费的时间。

我认为亚马逊不会对容器的配置收费,但是一旦运行时启动它们肯定会打到计时器。您可能需要支付SDK / JDK初始化的时间并加载它的类。他们肯定不会向我们收取启动容器的操作系统的费用。

运行simple Java Lambda两次显示新的和重用实例的不同时间。第一个是374.58 ms,第二个是0.89 ms。之后,您会看到400100毫秒的结算时长。对于第二个,容器被重用。虽然您可以尝试保持容器温暖,如@dashmug已经指出的那样,但AWS偶尔会回收容器,并且当负载增加或减少产生的新容器时。博客How long does AWS Lambda keep your idle functions around before a cold start?How does language, memory and package size affect cold starts of AWS Lambda?也值得一看。如果包含外部库,则时间会增加。如果您查看该博客,您可以看到对于Java而言,较小的内存分配通常会超过2-4秒。

查看这些时间,您应该增加超时,而不仅仅是查看应用程序提供的日志,而是查看STARTENDREPORT个条目以及实际的超时事件。每个正在运行的Lambda容器实例似乎都会创建自己的日志流。如果不经常调用Lambda,请考虑保持你的Lambdas温暖。

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: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

答案 1 :(得分:0)

尽量让你的功能保持温暖,看看它是否会有所作为。

如果超时确实是由容器预热引起的,那么保持温度将大大有助于降低这些超时的频率。在部署更改时,您仍然可以获得冷启动,但至少可以预测。

https://read.acloud.guru/how-to-keep-your-lambda-functions-warm-9d7e1aa6e2f0

答案 2 :(得分:0)

对于基于Java的应用程序,预热时间更长,因为你知道它正确的jvm。最好使用NodeJS或Python,因为它们的预热时间较短。如果您不是这样切换技术堆栈,只需通过触发它来保持容器温暖,或者增加内存,这将减少执行时间,因为lambda cpu分配更多用于更大的内存。