在Heroku dyno的上下文中,puma worker和puma thread有什么区别?
据我所知(如果我错了请纠正):
Thin不支持并发,因此Web进程一次只能处理一个请求
在unicorn中,我知道可以在一个进程中运行多个unicorn workers以添加并发性。
但是在puma中有线程和工作进程..难道工作进程不就是puma进程中的线程吗?
我能否使用更多的工作进程/线程来增加Heroku中的Web并发性?
在Heroku dyno的上下文中,puma worker和puma thread有什么区别?
据我所知(如果我错了请纠正):
Thin不支持并发,因此Web进程一次只能处理一个请求
在unicorn中,我知道可以在一个进程中运行多个unicorn workers以添加并发性。
但是在puma中有线程和工作进程..难道工作进程不就是puma进程中的线程吗?
我能否使用更多的工作进程/线程来增加Heroku中的Web并发性?
就像其他答案所述,这篇Heroku文章在解释某些配置项方面做得非常好。
但是,如果您需要在Heroku或任何地方调整应用程序,那么了解事情的工作原理是很有价值的。
当您说“工人是puma进程内的线程”时,我认为您几乎是正确的,我相信工人是从puma分叉出的操作系统级别进程,然后可以在内部使用线程。
据我所知 - puma将分叉其操作系统进程多少次取决于通过workers
配置设置以响应http请求。这使您可以处理多个请求并行处理,但这通常会占用更多内存,因为它将为每个工作者“复制”您的应用程序代码。
每个puma工作进程都将根据threads
配置在其操作系统进程中使用多个线程。这通过允许puma进程本身响应多个请求来添加并发性,以便如果一个线程被阻塞,即处理一个请求,它可以使用另一个线程处理新的请求。正如所述,这要求您的整个应用程序都是线程安全的,以便例如任何一个请求的全局配置都不会“泄漏”到另一个请求中。
您可以调整puma,使工作者的数量适合可用的CPU和内存数量,然后根据您想要饱和运行应用程序的主机以及应用程序的行为来调整线程数量 - 更多并不总是意味着更快/更多的请求吞吐量。
这是一个广泛的领域,我不是专家,但是...
Puma可以生成许多工作进程,每个工作进程可以使用多个线程来处理请求。
据我所知,Unicorn没有线程,它只有工作模型。
如果您使用线程,则需要确保您的代码是线程安全的。这意味着Rails,您依赖的任何gem和您自己的代码都需要考虑。
为了获得最佳性能,您还可能想查看具有适当的线程支持的JRuby或Rubinius。MRI受其GIL的限制。
Heroku上有一篇好文章,解释了Puma如何使用工作进程和线程。您应该阅读该文章并忽略我 :)
使您的代码线程安全通常很复杂。除了其他答案中提出的解决方案外,我还建议查看Mutex并了解DB如何处理线程的方式。为此,我推荐这个Postgresql SO答案。
工作进程:
线程: