2

我有一个用 Java 编写的 Lambda 函数,可以从 API Gateway 访问。在冷启动场景中,实际代码需要 1.5 秒才能完成执行(从 Cloudwatch Logs 验证),但在 API Gateway 中获得最终响应需要 10 多秒。这很烦人。

我已经为冷启动和热启动场景捕获了 X 射线跟踪器。

谁能帮我解决这个性能问题?

冷启动: 冷启动

热启动: 热启动

4

5 回答 5

1

解决用 Java 编写的冷启动的可能解决方案:为 lambda 添加更多内存,还有一种减少冷启动的方法:使用 Graal 原生映像工具。jar 被翻译成字节码。基本上,我们会做部分工作,这是在 aws 上完成的。当您构建代码时,在加载到 AWS 时 - 选择“自定义运行时”,而不是 java8。

有用的文章:https ://engineering.opsgenie.com/run-native-java-using-graalvm-in-aws-lambda-with-golang-ba86e27930bf

谨防:

但它也有其局限性;不支持动态类加载,反射支持也有限

于 2019-01-24T09:09:59.893 回答
0

这里有两种前进方式:a)正如其他人所说,增加内存。b) 向 lambda 函数发送请求以对其进行预热,并且由于 AWS lambda 容器的使用寿命不长,因此您需要经常这样做。

有几个因素会导致长时间的预热: a) 如果 lambda 在 vpc 中,附加 ENI 可能需要一些时间。b) lambda 中的 HTTPS 调用。

在引擎盖下有一个与您的 lambda 一起运行的容器。这个容器的生命周期不是很长,每次启动时,初始请求都需要一些时间来预热容器。事实上,你无法避免冷启动,它们总会发生。我个人发现在编写 Java 时非常明显,初始请求总是需要更长的时间。

这里有一篇关于如何避免冷启动的非常好的博客文章,但我相信你已经阅读过它。

于 2019-01-24T14:21:04.317 回答
0

Trick here need to worm your function either using fake call (schedler program) or using plugins like lambda warmer.

Note: Lambda design to handle event not for real world web application, if you keep worm lambda you will get same cost as EBS or EC2.

If your usecase required milisecond latancy go with compute or kubernatics.

于 2019-01-24T14:45:54.807 回答
0

另外需要注意的是,您选择的运行时也会影响冷启动。

Java 运行时冷启动时间最长,Python 运行时最短。

https://medium.com/@nathan.malishev/lambda-cold-starts-language-comparison-%EF%B8%8F-a4f4b5f16a62

于 2019-01-24T18:32:53.413 回答
0

当您在一段时间内没有触发 lambda 函数上的任何工作时,就会发生冷启动。所以亚马逊只是关闭了保存你代码的容器。您看到的减速只是亚马逊唤醒容器、加载 lambda 函数(如果您使用 Java 等静态代码技术可能需要更多时间,例如使用 JS 应该更慢)并实际运行它所花费的时间(与亚马逊的整个工作时间相比,在你的情况下这似乎微不足道)。

看看这篇关于 lambda 冷启动的有趣博客文章: https ://medium.com/thundra/dealing-with-cold-starts-in-aws-lambda-a5e3aa8f532

于 2018-10-31T14:05:26.597 回答