- 原文地址:Better performance by optimizing Gunicorn config
- 原文做者:Omar Rayward
- 译文出自:掘金翻译计划
- 本文永久连接:github.com/xitu/gold-m…
- 译者:shixi-li
关于如何配置 Gunicorn 的实用建议html
概要,对于 CPU 受限的应用应该提高集群数量或者核心数量。但对于 I/O 受限的应用应该使用“伪线程”。前端
Gunicorn 是一个 Python 的 WSGI HTTP 服务器。它所在的位置一般是在反向代理(如 Nginx)或者 负载均衡(如 AWS ELB)和一个 web 应用(好比 Django 或者 Flask)之间。python
Gunicorn 实现了一个 UNIX 的预分发 web 服务端。android
好的,那这是什么意思呢?ios
为了提升使用 Gunicorn 时的性能,咱们必须牢记 3 种并发方式。nginx
每一个 worker 都是一个加载 Python 应用程序的 UNIX 进程。worker 之间没有共享内存。git
建议的 workers
数量是 (2*CPU)+1
。github
对于一个双核(两个CPU)机器,5 就是建议的 worker 数量。web
gunicorn --workers=5 main:app
复制代码
Gunicorn 还容许每一个 worker 拥有多个线程。在这种场景下,Python 应用程序每一个 worker 都会加载一次,同一个 worker 生成的每一个线程共享相同的内存空间。编程
为了在 Gunicorn 中使用多线程。咱们使用了 threads
模式。每一次咱们使用 threads
模式,worker 的类就会是 gthread
:
gunicorn --workers=5 --threads=2 main:app
复制代码
上一条命令等同于:
gunicorn --workers=5 --threads=2 --worker-class=gthread main:app
复制代码
在咱们的例子里面最大的并发请求数就是 worker * 线程
,也就是10。
在使用 worker 和多线程模式时建议的最大并发数量仍然是(2*CPU)+1
。
所以若是咱们使用四核(4 个 CPU)机器而且咱们想使用 workers 和多线程模式,咱们可使用 3 个 worker 和 3 个线程来获得最大为 9 的并发请求数量。
gunicorn --workers=3 --threads=3 main:app
复制代码
有一些 Python 库好比(gevent 和 Asyncio)能够在 Python 中启用多并发。那是基于协程实现的“伪线程”。
Gunicrn 容许经过设置对应的 worker 类来使用这些异步 Python 库。
这里的设置适用于咱们想要在单核机器上运行的gevent
:
gunicorn --worker-class=gevent --worker-connections=1000 --workers=3 main:app
复制代码
worker-connections 是对于 gevent worker 类的特殊设置。
(2*CPU)+1
仍然是建议的workers
数量。由于咱们仅有一核,咱们将会使用 3 个worker。
在这种状况下,最大的并发请求数量是 3000。(3 个 worker * 1000 个链接/worker)
在 Python 中,线程和伪线程都是并发的一种方式,但并非并行的。可是 workers 是一系列基于并发或者并行的方式。
理论讲的很不错,但我应该怎样在程序中使用呢?
经过调整Gunicorn设置,咱们但愿优化应用程序性能。
workers
数量调整到 (2*CPU)+1
来支持这种编程范式。workers
** 的数量到建议的 (2*CPU)+1
,理解到最大的并行请求数量其实就是核心数。多线程
以及相应的 gthread worker 类 会产生更好的性能,由于应用程序会在每一个 worker 上都加载一次,而且在同一个 worker 上运行的每一个线程都会共享一些内存,但这须要一些额外的 CPU 消耗。workers
数量设置为 (2*CPU)+1
而且不用考虑 多线程
。从这个点开始,就是全部测试和错误的基准环境。若是瓶颈在内存上,就开始引入多线程。若是瓶颈在 I/O 上,就考虑使用不一样的 Python 编程范式。若是瓶颈在 CPU 上,就考虑添加更多内核而且调整 workers
数量。咱们软件开发人员一般认为每一个性能瓶颈均可以经过优化应用程序代码来解决,但并不是老是如此。
有时候调整 HTTP 服务器的设置,使用更多资源或经过别的编程范式从新设计应用程序都是咱们提高应用程序性能的解决方案。
在这种状况下,构建系统意味着理解咱们应该灵活应用部署高性能应用程序的计算资源类型(进程,线程和“伪线程”)。
经过使用正确的理解,架构和实施正确的技术解决方案,咱们能够避免陷入尝试经过优化应用程序代码来提升性能的陷阱。
若是发现译文存在错误或其余须要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可得到相应奖励积分。文章开头的 本文永久连接 即为本文在 GitHub 上的 MarkDown 连接。
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、前端、后端、区块链、产品、设计、人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划、官方微博、知乎专栏。