【问题标题】:How to overcome cold start issue in AWS Lambda with Zappa?如何使用 Zappa 克服 AWS Lambda 中的冷启动问题?
【发布时间】:2019-04-18 09:09:04
【问题描述】:

我已经使用 zappa 在 AWS 中部署了 api(Django 应用程序)。我正面临冷启动问题。启动应用程序需要将近 7-8 秒(代码将近 25 MB)。如何克服这个问题?

在 zappa settings.json 中,我保留了 keep_warm=true 但没有用。 我已经编写了 lambda 函数来使用调度 cloudwatch 事件触发 api,它正在触发(我可以在 zappa 日志中看到)但问题没有解决。

我的处理程序的示例代码是:

import json
def lambda_handler(event, context):
# TODO implement
return {
    'statusCode': 200,
    'body': json.dumps('Hello from Lambda!')
}

我的 zappa 配置是:

{
    "dev": {
        "aws_region": "ap-south-1",
        "django_settings": "api.settings",
        "profile_name": "default",
        "project_name": "api-public",
        "runtime": "python3.6",
        "s3_bucket": "api-public",
        "slim_handler": true,
        "vpc_config" : {
            "SubnetIds": [ "subnet-052347e86b94b75d3" ], // use the private subnet
            "SecurityGroupIds": [ "sg-0ba3a644d413a2b00","sg-0db0b6de5b14cda33"]
        },
        "xray_tracing": true,// Optional, enable AWS X-Ray tracing on your lambda function.
        "memory_size": 1024, // Lambda function memory in MB. Default 512.
        "log_level": "DEBUG", // Set the Zappa log level. Can be one of CRITICAL, ERROR, WARNING, INFO and DEBUG. Default: DEBUG
        "keep_warm": true, // Create CloudWatch events to keep the server warm. Default true. To remove, set to false and then `unschedule`.
        "timeout_seconds": 300,
        "keep_warm_expression": "rate(3 minutes)", // How often to execute the keep-warm, in cron and rate format. Default 4 minutes.
        "exclude": [
            ".git/*",
            ".gitignore",
            "boto3*",
            "*botocore*",
            "django-debug-toolbar*",
            "sqlparse*",
            "zappa_settings.json",
            "README.md"
        ],
        "lambda_description": "zappa deployment public", // However you want to describe your project for the AWS console. Default "Zappa Deployment".
        "extra_permissions": [{ // Attach any extra permissions to this policy. Default None
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction", 
            "Resource": ["arn:aws:lambda:ap-east-1:940180048916:function:api-public-dev"],// AWS Service ARN
        }],
    }
}

【问题讨论】:

  • 请注意,AWS 改变了 Lambda 联网的方式以减少这些冷启动的影响。尚未完全推出,但正在路上。更多信息,请阅读aws.amazon.com/blogs/compute/…

标签: python django amazon-web-services zappa cold-start


【解决方案1】:

您能否提供您的 Zappa 配置?以下是在设置文件的上下文中应如何使用keep_warm 的示例,其中包含更多设置:

{
    "production": {
        "aws_region": "us-east-1",
        "django_settings": "config.zappa",
        "profile_name": "zappa",
        "project_name": "mydomain",
        "runtime": "python3.6",
        "s3_bucket": "zappa-mydomain",
        "certificate_arn": "arn:aws:acm:us-east-1:272727272727:certificate/eeeeeeee-dddd-cccc-bbbb-aaaaaaaaaaaa",
        "domain": "mydomain.com",
        "exclude": [
                ".git/*",
                ".gitignore",
            "boto3*",
            "*botocore*",
            "django-debug-toolbar*",
            "sqlparse*",
            "zappa_settings.json",
            "README.md"
        ],
        "keep_warm": true,
        "timeout_seconds": 300
    }
}

祝你好运!

【讨论】:

  • 根据您的建议,我保留了上述设置...代码大小减少了 5Mb,但没有遇到冷启动问题
  • 我已经添加了我的 zappa 配置(已编辑)。
  • 部署时,您是否在部署期间看到一条线,说明它正在设置保持温暖?当我部署时,我的会这样说。
  • 当我看到日志时,我发现:[1555906810631] [DEBUG] 2019-04-22T04:20:10.629Z aef9d3a6-57f6-436a-956e-c0713c909b47 Zappa Event: {'time': ' 2019-04-22T04:19:24Z', 'detail-type': 'Scheduled Event', 'source': 'aws.events', 'account': '940180048916', 'region': 'ap-east-1 ', '详细信息': {}, '版本': '0', '资源': ['arn:aws:events:ap-south-1:940183248916:rule/2f22u81036ca6tre8a11f0671216dbc14c4e4-handler.keep_warm_callback'], 'id' : '620e9999-95cb-7116-9061-b4e000239fed', 'kwargs': {}} 但它不起作用
  • 与zappa settings.json中提到的区域有什么关系吗??
【解决方案2】:

从技术上讲,如果我们可以接受这是 AWS lambda 函数限制之一这一事实,这不是问题。

这里的主要问题是,由于这种限制(延迟),我们强迫自己使用显然不符合要求的 lambda。

如果我们在这种情况下使用 lambda,问题是这样的,

  • 让 lambda 函数存活一段时间会很昂贵!超级昂贵,显然 lambda(container) 不能像那个家伙那样工作!

我建议您使用 EC2 作为您的网络服务器 (API),而不是通过 lambda 通常的工作方式并在此基础上进行负载平衡。

在这种方法中,从 API 返回的响应 - 会更快,因为您的 api 处于唤醒状态并等待任何请求 - 比你在 lambda 上使用它更便宜,因为 lambda 对你的 Lambda 执行的计算时间每 GB 秒收取 0.00001667 美元,想象你的 lambda 醒了 10 分钟 :)

希望这会有所帮助! :)

干杯! 猴子

【讨论】:

  • 你的回答是根本错误的!保持 Lambda 处于活动状态并不意味着您要执行 X 时间的代码,而只是每隔一段时间对容器执行一次 ping 操作。容器通常在空闲时可以存活大约 5 分钟(有文章说有时可以存活 45 分钟)。此外,您说 Lambda 价格昂贵,但随后您提到了具有自动扩展和 ELB 的 EC2,对于低流量(低我说的是每月执行 3000 万次),这将比 Lambda 贵得多。如果这些函数运行一秒钟并已配置(续...)
  • 使用 1024MB,每月只需 49 美元。如果您随后至少为您的自动扩展组配置 2 个中型 EC2 实例,顶部有一个 ELB,这已经花费了 53 美元,这已经使其贵了 10%。但是,随着流量高峰,这会更高。长话短说:如果您不了解流量并且不知道 Lambda 冷启动是如何工作的,那么您不应该给出错误的假设。
  • 更不用说函数的运行速度通常快于一秒(但为了简单起见,让我们保留它),而且大多数时候每个函数 1024MB 是多余的。如果我们将这个数字降低到 256MB(在大多数情况下绰绰有余),那么 Lambda 函数的成本将仅为每月 11 美元。
  • 那么现在,如何在不触发函数的情况下加热 aws lambda 函数?此外,如果您没有计算器,请使用 AWS 计算器。请参阅附加的屏幕截图 [在此处输入图像描述][1] [1]:i.stack.imgur.com/18P2R.png
  • 帮助计算的老兄:基于您:1. 执行次数 = 30,000,000 2. 分配的内存 (MB) = 1024MB 3. 预计执行时间 (ms) = 5000 (5 秒) 将花费你每月 = 2499.63 美元/月 数学很重要 :) 和平
【解决方案3】:

周期性命中是简单的技术,但对于同时请求的情况却无济于事。一个 lamdba 实例一次只能处理一个请求。我不确定如何用 zappa 来做。然而,有希望的解决方案是使用 docker checkpoints

https://www.imperial.ac.uk/media/imperial-college/faculty-of-engineering/computing/public/1819-ug-projects/StenbomO-Refunction-Eliminating-Serverless-Cold-Starts-Through-Container-Reuse.pdf

当然你可以加倍内存。账单不会翻倍,因为请求会得到更快的处理。

我也有点幻想在 zappa 中添加一些奇特的策略,比如默认运行 cheep 1M 实例,但会检测冷启动并重定向到 3M 实例或 bean,但检查点似乎更适合 django 等超大型框架。

【讨论】:

    【解决方案4】:

    如果您需要对 Django 应用程序进行保温,首先是您以错误的方式使用 AWS Lambda 函数。 (相信我,个人经验)

    创建 AWS Lambda 函数是为了将轻量级函数部署到世界各地。您的 Django 应用程序是有史以来最重(最)的功能。

    AWS Lambda 专为生命周期只有几分之一秒的应用程序而设计。 25 MB 本身对 Lambda 函数来说是一个巨大的负载。

    请考虑使用轻量级框架作为 Flask。不要克服 Lambda 函数。他们不是为此而生的。

    改为使用 AWS ECS。

    【讨论】:

      猜你喜欢
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      • 2018-04-14
      • 2019-11-21
      • 2021-11-06
      • 2022-10-04
      • 1970-01-01
      • 2020-10-24
      相关资源
      最近更新 更多