【问题标题】:Flask application: Using gunicorn on ECS Fargate , How toFlask 应用程序:在 ECS Fargate 上使用 gunicorn,如何
【发布时间】:2022-04-02 02:07:23
【问题描述】:

信息

  • 我创建了一个烧瓶应用程序并在我的 Dockerfile 上最后一个命令CMD gunicorn -b 0.0.0.0:5000 --access-logfile - "app:create_app()"
  • 我在 ECR 上构建、标记和上传图像
  • 我使用这个 docker 镜像创建了一个 ECS Fargate 实例,其配置如下(仅发布问题所需的配置):
ECSTaskDefinition: 
  Type: AWS::ECS::TaskDefinition  
  Properties:  
    Cpu: "256"  
    Memory: "1024"  
    RequiresCompatibilities:
      - FARGATE
    ContainerDefinitions:
      - Name: contained_above
            .
            .
            .
ECSService:
  Type: AWS::ECS::Service
  DependsOn: ListenerRule
  Properties:
    Cluster: !Sub "${EnvName}-ECScluster"
    DesiredCount: 1
    LaunchType: FARGATE
    DeploymentConfiguration:
      MaximumPercent: 200
      MinimumHealthyPercent: 50
    NetworkConfiguration:
      AwsvpcConfiguration:
        AssignPublicIp: ENABLED
        Subnets:
          - Fn::ImportValue: !Sub "${EnvName}-PUBLIC-SUBNET-1"
          - Fn::ImportValue: !Sub "${EnvName}-PUBLIC-SUBNET-2"
        SecurityGroups:
          - Fn::ImportValue: !Sub "${EnvName}-CONTAINER-SECURITY-GROUP"
      ServiceName: !Sub "${EnvName}-ECS-SERVICE"
      TaskDefinition: !Ref ECSTaskDefinition
      LoadBalancers:
        - ContainerName: contained_above
          ContainerPort: 5000
          TargetGroupArn: !Ref TargetGroup

(应用正常运行)

问题

现在我的问题是 gunicorn 命令(我在 dockerfile 中的最后一个命令)上的工作人员应该是多少?

gunicorn design 上声明使用Generally we recommend (2 x $num_cores) + 1 as the number of workers to start off with.

那么,fargate 上的核心数是多少?像上述过程一样将 gunicorn 与 Fargate 结合起来真的有意义吗?负载均衡器和 gunicorn 工作者之间是否存在“兼容性”? ECS服务的DesiredCount和gunicorn-w工人价值观有什么联系?我是否遗漏或误解了什么?

可能的解决方案(?)

我可以这样称呼它:

CMD gunicorn -b 0.0.0.0:5000 -w $(( 2 * `cat /proc/cpuinfo | grep 'core id' | wc -l` + 1 )) --access-logfile - "app:create_app()"

但我不确定这是否是一个好的解决方案。 有什么见解吗?谢谢

【问题讨论】:

标签: flask gunicorn amazon-ecs aws-fargate


【解决方案1】:

编辑:我正在使用 gunicorn 在启动时使用的配置文件: gunicorn.conf.py

import multiprocessing


bind = "0.0.0.0:8080"
workers = multiprocessing.cpu_count() * 2 + 1
worker_class = "uvicorn.workers.UvicornH11Worker"
keepalive = 0

您可以通过 --config 标志告诉 gunicorn 使用哪个配置文件。

遗憾的是,我再也找不到源了,但我读到 4 到 12 个工作人员应该足以同时处理数百个甚至数千个请求 - 取决于您的应用程序结构、工作人员类别和有效负载大小。 一定要小心翼翼,因为我再也找不到来源了,但如果我没记错的话,这是一个知名人士接受的 SO 答案。

Offical gunicorn docs state somthing in the 2-4 x $(NUM_CORES)range。 另一种选择是 gunicorn docs 在另一点状态:

通常我们建议 (2 x $num_cores) + 1 作为工人数量 开始。虽然不是太科学,但公式是基于 假设对于给定的核心,一名工作人员将阅读或 当其他工作人员正在处理一个 请求。

显然,您的特定硬件和应用程序将 影响最优工人数量。我们的建议是开始 使用 TTIN 和 TTOU 信号进行上述猜测和调整,而 应用程序正在加载中。

到目前为止,我一直很好地遵守 4-12 工作人员的建议。我的公司运行多个 API,它们连接到那里的其他 API,这导致请求时间大多为 1-2 秒,最长需要一分钟(这里有很多外部 API 调用)。

我交谈过的另一位同事提到,他们期望每 5 个并发请求使用 1 个工作人员 - 使用与我们类似的 API。也适用于他们。

【讨论】:

    猜你喜欢
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-28
    • 2022-01-15
    • 2021-08-29
    • 2021-02-01
    相关资源
    最近更新 更多