Lambda使用Docker- 持续时间短,计费时间却很高

0

【以下的问题经过翻译处理】 我们正在使用Lambda在Docker(ECR)中运行,代码是使用Python编写的,具有许多依赖项(Docker大小为700MB)。我们注意到我们的代码执行时间非常短(约为650毫秒),但与之相比,计费时间非常高(4500毫秒),初始化时间为(约为3800毫秒)。因此,基本上每次执行的初始化时间占据了我们计费时间的80%。

我的以前的管道:每45分钟,我们同时启动200个具有不同参数的Lambda实例(我猜是200个冷启动?)

我的新管道:每45分钟,我启动相同的Lambda,不带参数(1次冷启动),然后这个Lambda再启动200次相同的Lambda,但带有参数(200次热启动?)

但是使用新管道后,问题仍然没有改善,我看不到任何改进:REPORT RequestId:f9d67348-2deb-410e-b874-b29e8b3569b2 Duration:653.58ms Billed Duration:4353ms Memory Size:300 MB Max Memory Used:284 MB Init Duration:3698.46ms

因此,以下是我的三个问题:

  • 3800毫秒是正常的冷启动时间吗?
  • 在我的新管道中,为什么初始化持续时间没有改进?
  • 您建议采取什么方法来降低/解决成本?
profile picture
专家
已提问 5 个月前45 查看次数
1 回答
0

【以下的回答经过翻译处理】 问题)3800毫秒是正常的冷启动时间吗?答)冷启动受运行时和Lambda函数的依赖项影响。正常的冷启动时间实际上取决于Lambda函数正在执行的任务。Lambda函数在初始化持续时间内执行的任务越少,冷启动时间就越短。如果您想要查看Docker容器对冷启动的影响,您可以创建一个Lambda函数,仅打印"hello world",并收集性能基准数据。

问题)在我的新管道中,为什么初始化持续时间没有改进?答)目前不太清楚您的Lambda函数是否仍然经历冷启动。您可以使用CloudWatch Insights查询Lambda函数的日志,并生成有关冷启动的报告。以下是您可以使用的查询示例:

filter @type = “REPORT”
  | stats count(@type) as countInvocations, 
    count(@initDuration) as countColdStarts, 
    (count(@initDuration)/count(@type))*100 as percentageColdStarts,
    max(@initDuration) as maxColdStartTime,
    avg(@duration) as averageDuration,
    max(@duration) as maxDuration,
    min(@duration) as minDuration,
    avg(@maxMemoryUsed) as averageMemoryUsed,
    max(@memorySize) as memoryAllocated,  (avg(@maxMemoryUsed)/max(@memorySize))*100 as percentageMemoryUsed 
  by bin(1h) as timeFrame

您可以使用这个方法来比较这两个管道。您还可以使用X-Ray来追踪Lambda函数,X-Ray守护程序会记录有关函数调用和执行的详细信息。

问题)您建议采取什么方法来降低/解决成本?有三个方面可以考虑:

  1. 如果你的Lambda函数仍然受到冷启动的影响,你可以使用Reserved Concurrency来限制函数的并发实例数量。如果我了解您的工作负载,就是同一个 Lambda,只是接收了不同的参数,因此您可以使用预置并发来确保不会创建 200 个函数实例。您需要测试我们不同的最大并发实例数,以找到最能满足您对成本和速度的要求的方法。
  2. 确保您正在优化静态初始化
  3. 使用 AWS Lambda Power Tuning 对函数进行分析,以确保您使用了最经济和/或性能最佳的内存配置。
profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则