【发布时间】:2018-06-08 22:47:38
【问题描述】:
AWS ECS Fargate 启动和运行 Docker 映像的最短/平均时间是多少?
为了争论,45MB anapsix/alpine-java 图像。
我想研究使用 ECS Fargate 来加快在速度较慢的笔记本电脑/PC 上本地构建软件的过程,方法是将软件构建在速度更快的远程服务器上。
因此,映像的启动时间对于使努力值得一试至关重要。
【问题讨论】:
标签: aws-fargate aws-ecs
AWS ECS Fargate 启动和运行 Docker 映像的最短/平均时间是多少?
为了争论,45MB anapsix/alpine-java 图像。
我想研究使用 ECS Fargate 来加快在速度较慢的笔记本电脑/PC 上本地构建软件的过程,方法是将软件构建在速度更快的远程服务器上。
因此,映像的启动时间对于使努力值得一试至关重要。
【问题讨论】:
标签: aws-fargate aws-ecs
鉴于我使用 Fargate 的经验,我不同意接受的答案。
我已经在 Fargate 上启动了 1000 个容器,甚至在 AWS 架构博客中介绍了我们对 Fargate 的使用。 https://aws.amazon.com/blogs/architecture/building-real-time-ai-with-aws-fargate/
NAT 网关后面的私有子网对我们来说与 IGW 后面的容器没有不同的启动时间。如果您确定使用单个 NAT 实例,您的里程可能会有所不同。
Fargate 中的容器启动时间完全取决于容器的大小。 Fargate 不缓存容器,因此每个运行任务都会导致 docker pull 发生。如果你的镜像是基于 Ubuntu 的,你会遇到很糟糕的事情。
我们混合了 GO from scratch 容器和 Alpine 节点容器。
根据我们从 1000 次启动中汇总的指标,平均而言,容器从头开始启动并在 10-15 秒内在目标组中运行良好。
Alpine 容器平均需要 30-40 秒才能启动并恢复正常。
任何比这更长的时间,并且您的容器可能太大,以至于 Fargate 无法提供任何意义,直到它们提供预缓存的 ecr 或类似的东西。
对于您的具体示例,我们有类似大小的容器,如果您的入口点运行良好(即不是 60 秒的 java 启动时间),您的 45mb 容器应该启动并准备好在 30-60 秒内运行。
【讨论】:
我仍在等待 ECS+EC2 中已经提供的 Fargate 中的缓存。可以跟踪此功能请求here。容器在 AWS Fargate 上启动需要这么长时间,真是让人头疼。 Google Cloud Platform 已经提供了托管 Cloud Run (K8s) 环境中普遍可用的此功能,其中容器在收到请求时会即时启动(约 2 秒)。它们在(可配置的)5 分钟后空闲,这导致您只需为这 5 分钟付费。
AWS Fargate 还没有提供如此好的“温暖容器”功能,尽管我强烈推荐他们这样做。要做到这一点,将计算和存储紧密结合起来可能在技术上很困难,它需要大量的内部带宽才能像 Google 一样快速加载这些容器。
尽管如此,以下是我在 AWS Fargate 上使用 Docker 容器的经验。从以下我启动的容器示例(2019 年 2 月)可以看出,启动时间与容器映像大小高度相关:
4000 MB ~ 5 分钟
2400 MB ~ 4 分钟
1000 MB ~ 2 分钟
350 MB 〜 50 秒
我建议您在轻量级基础映像(例如 Minideb 或 Alpine)上构建您的容器映像。这将使您的容器映像非常小,从几个 10MB 到几个 100MB。但话又说回来,当你需要一个带有一些额外包和 c-lib 的 JVM 或 Python 时,你会很容易达到 1000 MB。
【讨论】:
我现在在 Fargate 和公共 VPC 上启动了 100 多个容器,它们平均需要大约 4 分钟,但在糟糕的一天我看到它长达 7-8 分钟。
如果您在私有 VPC 上启动它,那么时间可能会急转直下。我发现如果 NAT 实例过载,启动 Fargate 容器需要 2 个小时。
希望 AWS 会随着时间的推移加快这一进程。启动 Fargate 容器所需的时间应该不会比将 docker 映像上传到 ECR 所需的时间更长。
【讨论】:
可以在 EC2 启动类型上使用 ECS_IMAGE_PULL_BEHAVIOR = prefer-cached 以在很大程度上减少代理启动时间。
【讨论】: