我们有一个用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
除非我误解了某些内容,否则由于容器初始化导致的延迟似乎已经发生。假设代码执行不应该在一次执行到下一次执行的速度上有显着差异,那我错了吗?或者这只是我们应该期待的事情?
答案 0 :(得分:2)
设置新容器或更换冷容器需要一些时间。两者都与你的时间不符。您在控制台中看到的时间是您需要付费的时间。
我认为亚马逊不会对容器的配置收费,但是一旦运行时启动它们肯定会打到计时器。您可能需要支付SDK / JDK初始化的时间并加载它的类。他们肯定不会向我们收取启动容器的操作系统的费用。
运行simple Java Lambda两次显示新的和重用实例的不同时间。第一个是374.58
ms,第二个是0.89
ms。之后,您会看到400
和100
毫秒的结算时长。对于第二个,容器被重用。虽然您可以尝试保持容器温暖,如@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秒。
查看这些时间,您应该增加超时,而不仅仅是查看应用程序提供的日志,而是查看START
,END
和REPORT
个条目以及实际的超时事件。每个正在运行的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分配更多用于更大的内存。