首页 > 解决方案 > 请求通过 Zappa 部署在 AWS Lambda 中的 Django 应用程序花费的时间太长

问题描述

我最近使用Zappa将 Django 后端应用程序部署到 AWS Lambda 。

在一段时间没有调用 lambda 函数后,第一个请求需要 10 到 15才能处理。起初我以为是冷启动的原因,但即使是冷启动,这次也是不可接受的。然后,通过阅读 Zappa 的文档,我看到它默认启用了keep_warm每 4 分钟向 lambda 函数发送一个虚拟请求以使其保持温暖的功能;因此,对 lambda 的第一个请求的响应过度延迟不是由于冷启动。

然后,我开始使用 AWS X-Ray 和 Cloudwatch Insights 等工具来尝试找到延迟的原因。这是我发现的:

需要很长时间才能处理的调用如下: 在此处输入图像描述

用红色划掉的是应用程序使用的环境变量的名称。它们都直接在 AWS 控制台中定义并分配了一个值。我不明白的是,首先,为什么需要这么长时间,其次,为什么它说环境变量被强制转换为None. 该应用程序运行良好(除了第一次请求中的大量延迟),因此环境变量在某处正确设置。

这个请求每两个小时虔诚地发出一次,并且有人在一段时间内第一次调用 lambda 函数,如下图所示:

在此处输入图像描述

x 轴上的点对应于 Zappa 保持服务器温暖的虚拟请求。升高的点对应于上图中显示的调用。最后,峰值对应于用户调用。处理时间是处理长调用(第一张图片中显示的那个)所花费的时间和处理客户端向服务器发出的最长 http 请求所花费的时间的总和。该请求如下:

在此处输入图像描述

这是一个常规的登录请求,应该更快地解决。其他可能比这个要求更高的请求在不到 100 毫秒内得到解决。

所以,总结一下:

  1. 有一个 lambda 调用需要超过 10 秒才能解决。这对应于显示的第一张图像。它每 2 小时完成一次,当用户在服务器空闲一段时间后向服务器发出请求时。
  2. 有些请求需要超过 2 秒才能解决,我不知道为什么会这样。
  3. 除了这些先前的函数调用之外,所有其他请求都在合理的时间范围内得到解决。

任何关于为什么这些调用会花费这么多时间的想法都非常感谢,因为我花了很多时间试图自己弄清楚,但我已经没有想法了。先感谢您!

编辑 1 (28/07/21):为了进一步支持我的怀疑,即这里的延迟不是由于冷启动,这里是 Cloudwatch/Application monitoring/Traces 中功能的“Segments Timeline”:

在此处输入图像描述

如果是冷启动,延迟应该出现在“初始化”部分而不是“调用”部分。

编辑 2(21 年 7 月 30 日):我忘了提到我之前使用 Elastic Beanstalk 部署了应用程序并且没有遇到这个问题,所以我的代码性能可能不是这里的问题。

编辑 3(21 年 7 月 30 日):我在 2016 年的 AWS 论坛中发现了这个关于这个确切问题的帖子。一位 AWS 工程师提到,对于 VPC 之外的 Lambda 函数(如我的),这种行为绝不是预期的。然而,没有提供任何答案来解释 10-15 秒延迟的原因。

编辑 4 (03/08/21):我尝试将函数分配的内存加倍(从 512 MB 到 1024 MB),但没有帮助。

标签: djangoamazon-web-servicesaws-lambdazappa

解决方案


我可以在这里看到一些关于尝试增加 lambda 内存的建议(我还看到你尝试从 512 到 1024)。您是否尝试过进一步增加它,例如大约 3072?这是一个显着的增长,但这只是为了证明问题首先不是由于资源限制造成的。

就我所见,keep_warm 功能不能保证,并且大部分(冷)启动时间是由于初始化。由于分配给 lambda 的 vcpu 与您分配给它的内存成正比,因此您的 lambda 可能会更快地初始化并以某种方式减轻这些冷启动。


推荐阅读