Gunicorn工作进程与Heroku工作dynos的区别

7
我希望社区能为我澄清一些问题,让其他人也受益。
我的理解是,gunicorn工作进程实际上是Heroku Web Dynos的虚拟副本。换句话说,Gunicorn的工作进程不应与Heroku的工作进程混淆(例如,Django Celery Tasks)。
这是因为Gunicorn工作进程专注于处理Web请求(基本上是提高Heroku Web Dyno的性能),而Heroku Worker Dynos则专门处理长时间运行的后台任务等远程API调用。
我有一个简单的Django应用程序,充分利用了远程API,并且我想优化资源平衡。我还在大多数请求中查询PostgreSQL数据库。
我知道这非常简单,但我是否正确地思考了这些问题?
一些相关信息:

https://devcenter.heroku.com/articles/process-model

https://devcenter.heroku.com/articles/background-jobs-queueing

https://devcenter.heroku.com/articles/django#running-a-worker

http://gunicorn.org/configure.html#workers

http://v3.mike.tig.as/blog/2012/02/13/deploying-django-on-heroku/

https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/gunicorn/

其他与此主题相关的有用SO问题:

在Nginx + Gunicorn + Django堆栈上解决网站缓慢问题

Django在Heroku上与Gunicorn部署时性能下降

为Heroku配置Django的gunicorn

在Nginx + Gunicorn + Django堆栈上解决网站缓慢问题


一个 dyno 更像是一个主机,而 gunicorn worker 是在该主机上运行的进程。它们之间没有一对一的对应关系,因为你可以在单个 dyno 上运行多个 gunicorn worker 进程。如果想要调整你的应用程序和堆栈,你可以考虑查看 New Relic。由于在 Heroku 上免费获得 New Relic 标准订阅级别的访问权限,所以至少可以尝试一下,不会有任何损失。 - Graham Dumpleton
谢谢Graham,我正在使用New Relic,它非常有用。我的理解是,Heroku dyno 是一个单线程、一个进程的主机,而 gunicorn 是一个可以生成工作进程以处理多个Web请求并发的进程。话虽如此,我仍在寻找有人能够确认 gunicorn worker 和 heroku worker dyno 在根本上是否不同。 - BFar
1
很久以前,Ruby的dynos只能运行单线程进程。但现在不是这样了。你可以使用foreman在一个dyno中运行多个进程,在gunicorn中,你可以告诉它运行三个工作进程来处理请求。从技术上讲,我可以(而且正在努力),在一个dyno中运行Apache/mod_wsgi,并拥有多个处理请求的多线程进程。 - Graham Dumpleton
在Heroku上使用foreman,您可以在一个dyno上运行gunicorn和Celery。该文档表示3个gunicorn worker仅是一个示例,决定您可以运行多少进程的因素是可用内存以及您的进程使用了多少内存。https://devcenter.heroku.com/articles/procfile - Graham Dumpleton
不,我不相信你可以在同一个 dyno 上运行 gunicorn 和 celery。你需要指定不同的进程并分别进行扩展和缩减。 - Bob Spryn
显示剩余2条评论
1个回答

16
为了回答问题并防止人们在评论中进行搜索,dyno 就像一台完整的计算机。使用 Procfile,您为每个 dyno 提供一个命令来运行,并且它会周期性地重新运行该命令以刷新它,并在崩溃时重新运行该命令。正如您所想象的那样,浪费一整台计算机来运行单线程 Web 服务器是相当浪费的,这就是 Gunicorn 的作用所在。
Gunicorn 主线程仅充当代理服务器,生成给定数量的应用程序副本 (workers),并将 HTTP 请求分配给它们。它利用每个 dyno 实际上具有多个核心的事实。正如某些人提到的那样,您应选择的 worker 数量取决于您的应用程序运行所需的内存量。
与Bob Spryn在上一个评论中说的相反,利用这个并行机会在同一个dyno上运行单独的服务器有其他方法。最简单的方法是创建一个单独的子进程文件,并从您的主Procfile中运行所有Python Foreman等效项Honcho,按照这些说明进行操作。在这种情况下,您的单个dyno命令是一个管理多个单个命令的程序。这有点像从精灵那里获得一个愿望,并使愿望变成4个更多的愿望。
这样做的优点是您可以充分利用dynos的容量。这种方法的缺点是当它们共享一个dyno时,您失去了独立扩展应用程序各个部分的能力。当您扩展dyno时,它将扩展您复用到其中的所有内容,这可能不是所需的。您可能需要使用诊断来决定何时将服务放在自己的专用dyno上。

有没有办法知道Heroku Dyno有多少个核心?我觉得在处理它们时,拥有比核心更多的工作进程是没有意义的! - diegopau
2
如果你的应用程序是I/O绑定(像大多数应用程序一样),那么无论核心数量如何,通过让Gunicorn在每个dyno上生成多个worker,你肯定可以获得一些优势。这篇文档提供了一些很好的信息:https://devcenter.heroku.com/articles/python-gunicorn#basic-configuration - acjay
有关各种层级的Dyno可以拥有多少个操作系统进程的更多信息(请阅读“进程”部分),请访问以下链接:https://devcenter.heroku.com/articles/dynos - Aung Khant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接