【问题标题】:how many uvicorn workers do I have to have in production?我在生产中需要多少个 uvicorn 工人?
【发布时间】:2022-06-13 23:31:39
【问题描述】:

我的环境

  • FastAPI
  • Gunicorn 和 Uvicorn 工人
  • AWS EC2 c5.2xlarge (8 vCPU)

文档

https://fastapi.tiangolo.com/deployment/server-workers/

问题

目前我在生产服务器中使用 24 个 Uvicorn 工作人员。 (c5.2xlarge)

gunicorn main:app --workers 24 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:80

我了解到一个进程在一个内核上运行。 因此,如果我有 8 个进程,我可以利用整个内核(c5.2xlarge 的 vCpu == 8)

我很好奇在这种情况下,如果我的进程数超过 8 个,是否有任何性能优势?

【问题讨论】:

    标签: gunicorn fastapi uvicorn


    【解决方案1】:

    推荐的工人数量是2 x number_of_cores +1

    你可以阅读更多关于它的信息 https://docs.gunicorn.org/en/stable/design.html#:~:text=Gunicorn%20should%20only%20need%204,workers%20to%20start%20off%20with.

    如果您的 CPU 内核为 8 个,您应该使用 17 个工作线程。

    关于异步系统的其他想法:

    二次核并不是文中所说的科学数字。但想法是一个线程可以同时进行 I/O 和另一个 CPU 处理。这最大限度地利用了并发线程。即使使用异步系统,从概念上讲这也是可行的,并且应该为您提供最大的效率。

    【讨论】:

    • 谢谢!但我很好奇这是否适用于异步工作者?因为他们可以在等待 IO 时处理其他事情(由于事件循环)
    • 我在答案中添加了这个。供大家参考。
    【解决方案2】:

    一般来说,最佳做法是:

    number_of_workers = number_of_cores x 2 + 1
    

    或更准确地说:

    number_of_workers = number_of_cores x num_of_threads_per_core + 1
    

    原因是 CPU 超线程,它允许每个内核运行多个并发线程。并发线程数由芯片设计者决定。

    每个 CPU 内核有两个并发线程很常见,但有些处理器可以支持两个以上。

    为 AWS ec2 资源提到的

    vCPU 已经是您在机器上拥有的处理单元的超线程数量 (num_of_cores x num_of_threads_per_core)。不要与该机器上可用的内核数量相混淆。

    因此,在您的情况下,c5.2xlarge 机器的可用并发工作人员数量为 8。

    【讨论】:

      猜你喜欢
      • 2017-02-13
      • 2021-08-15
      • 2012-06-22
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2011-01-10
      • 2022-12-15
      • 2013-03-18
      相关资源
      最近更新 更多