我有一个用Java编写的Lambda函数,可以从API Gateway访问该函数。 在冷启动方案中,实际代码需要1.5秒才能完成执行(已通过Cloudwatch Logs验证),但要花费10秒以上的时间才能在API Gateway中获得最终响应。真烦人。
我已经捕获了冷启动和热启动场景的X射线示踪剂。
有人可以帮助我解决此性能问题吗?
答案 0 :(得分:1)
解决用Java编写的冷启动的可能解决方案: 为lambda添加更多内存,还有另一种减少冷启动的方法:使用Graal本机图像工具。罐子被翻译成字节码。基本上,我们会做一部分工作,这是在aws上完成的。构建代码时,在加载到AWS时-选择“自定义运行时”,而不是java8。
当心:
但它也有其局限性;它不支持动态类加载,并且反射支持也受到限制
答案 1 :(得分:0)
当您一段时间未触发lambda函数的任何工作时,就会发生冷启动。因此,亚马逊只是关闭了保存您代码的容器。您看到的变慢只是亚马逊唤醒容器,加载lambda函数所花费的时间(如果您使用的是Java等静态代码技术,则可能会花费更多时间,例如使用JS会更慢),然后实际运行它(与亚马逊的整个工作时间相比,这在您看来可以忽略不计。
看看有关lambda冷启动的这篇有趣的博客文章: https://medium.com/thundra/dealing-with-cold-starts-in-aws-lambda-a5e3aa8f532
答案 2 :(得分:0)
这里有两种前进方式: a)如其他人所述,增加内存。 b)向lambda函数发送请求以对其进行预热,并且由于AWS lambda容器的寿命不长,因此您需要非常频繁地进行此操作。
以下几个因素可导致长时间的热身: a)如果lambda在vpc中,则附加ENI可能需要一些时间。 b)在您的lambda中进行HTTPS调用。
引擎盖下有一个装有lambda的容器。该容器的寿命不是很长,每次启动时,最初的请求都会花一些时间来预热该容器。事实是,您无法避免冷启动,它们总是会发生。我个人发现在编写Java时它非常引人注目,最初的请求总是要花更长的时间。
关于如何避免冷启动here有一篇非常不错的博客文章,但是我相信您已经阅读了。
答案 3 :(得分:0)
这里的技巧需要使用假调用(调度程序)或使用lambda warmer之类的插件来蠕虫传播功能。
注意: Lambda设计用于处理不适用于实际Web应用程序的事件,如果保留蠕虫Lambda,则将获得与EBS或EC2相同的成本。
如果用例需要毫秒级的延迟,则可以使用计算或Kubernatics。
答案 4 :(得分:0)
要注意的另一件事是,您选择的运行时也会影响冷启动。
Java运行时的冷启动时间最长,而Python运行时的时间最短。
https://medium.com/@nathan.malishev/lambda-cold-starts-language-comparison-%EF%B8%8F-a4f4b5f16a62