【问题标题】:AWS Lambda: Identifying cold startsAWS Lambda:识别冷启动
【发布时间】:2018-04-14 03:24:12
【问题描述】:

是否有明确的方法来识别“冷启动”?是在 Lambda 本身的运行时,还是通过日志?我知道冷启动的特点是运行时间更长,我实际上可以看到,但我正在寻找一种明确的方式。 如果这很重要,我正在使用 Node.js。

更新:下面有两个很好的答案,适用于两个用例: - 在 lambda 运行时识别冷启动。 - 从 CloudWatch 日志中识别冷启动。

【问题讨论】:

    标签: amazon-web-services aws-lambda serverless cold-start


    【解决方案1】:

    如果您在 NodeJS 脚本的顶部添加一些初始化代码,您将能够在代码中告知这是一个冷启动,然后您将能够记录下来,如果您想在日志。例如:

    var coldStart = true;
    console.log("This line of code exists outside the handler, and only executes on a cold start");
    
    
    exports.myHandler = function(event, context, callback) {
      if (coldStart) {
        console.log("First time the handler was called since this function was deployed in this container");
      }
      coldStart = false;
    
       ...
       
      callback(...);
    }
    

    更新:

    如果您只关心在日志中查看冷启动,Lambda 现在会在 CloudWatch Logs 中为冷启动记录一个额外的 “Init Duration” 值。

    【讨论】:

    • 虽然这是很好的信息,但我强烈建议触发 CloudWatch 自定义指标,以便您可以轻松衡量和绘制此信息。
    • @Mark B,如果是python脚本,如何检查冷启动?
    • @Manoranjan Python Lambda 函数的行为没有区别。您可以使用在 Python 中的处理函数之外定义的值,就像这个 JavaScript 示例一样。
    • @SpiritualOverflow,这几乎是一样的。在 Python 脚本中为您的 Lambda 函数在处理函数之外设置一个变量:cold_start = True。该代码行将在实例初始化期间运行。然后一个处理函数中,检查该变量是否被设置并在之后重置它:if cold_start: print("cold_start happened"); cold_start = False。 (在 Python 中实际上不允许在一行中使用多个语句,因此请在 if 条件之后制作一个适当的块。)
    • @SpiritualOverflow,或者为实例的调用次数创建一个计数器。在处理程序函数之外:invocation_count = 0,在/任何处理程序内部:invocation_count += 1。然后您可以在/any 处理程序中测试invocation_count:如果它为零,则您的实例刚刚被初始化。如果不为零,则实例先处理事件。这甚至比我之前的评论 ^ 更好,因为它会告诉您单个实例处理了多少事件。我在这个实验中使用了这个技巧:xebia.com/blog/….
    【解决方案2】:

    作为一项更新,AWS 现在以“Init Duration”的形式在 Cloudwatch 日志的报告部分中提供有关冷启动的可见信息。未遭受冷启动的调用不会在日志中包含此信息

    持续时间:1866.19 毫秒计费持续时间:1900 毫秒内存大小:512 MB 使用的最大内存:163 MB 初始化持续时间:2172.14 毫秒

    【讨论】:

    • 很好的补充 - 在 CloudWatch 日志中使用该字段不再需要脚本来存储全局变量(在实例启动期间初始化)以识别来自处理程序函数的冷启动。
    【解决方案3】:

    如果您正在查看 CloudWatch 日志,您的 Lambda 函数的每个 LogGroup 都代表一个单独的容器,因此该 LogGroup 的第一次调用是您的冷启动。

    【讨论】:

    • 这句话很有趣,可能有用。请你指点我写它的文档吗?
    • @olpa 我向 Yan Cui here 提出了同样的问题,我得到了这个response。似乎它没有记录,但被亚马逊的某个人证实了。我可以从经验中确认,在冷启动期间记录某些内容会在 CloudWatch LogGroup 的开头看到。
    • 谢谢,我认为我的经验和直觉也证实了这种工作方式。
    • 我编写了一些测试代码来检查这一点(在 Lambda 处理函数外部使用 let coldStart = true,在函数内部使用 coldStart = false)并且可以确认冷启动总是在 CloudWatch 中启动一个新的 LogGroup。跨度>
    • @RichVel 感谢您的确认。
    猜你喜欢
    • 1970-01-01
    • 2021-11-06
    • 2022-10-04
    • 2019-11-21
    • 2020-07-02
    • 1970-01-01
    • 2020-05-18
    • 2020-10-24
    • 1970-01-01
    相关资源
    最近更新 更多