为什么Rails 5在开发中使用Puma而不是Webrick?

9
我尝试找出 Puma 和 Webrick 之间的区别,但并没有找到或满意的答案。因此,有人可以分享相关信息吗?

“为什么”Puma是更好/更快的服务器。这已经足够好的理由了。(而且你从一开始就拥有生产级别的服务器,不需要在生产环境中使用另一个服务器) - Sergio Tulentsev
@SergioTulentsev,你有什么基准来支持你的说法Puma更快吗?puma.io只是将其与其他(非WEBrick)服务器进行比较。 - NobodysNightmare
3个回答

11

默认情况下,WEBrick单线程、单进程的。这意味着如果两个请求同时到达,第二个请求必须等待第一个请求完成。

处理缓慢 I/O 的最有效方式是使用多线程。工作进程在其内部生成几个工作线程。每个请求由其中一个线程处理,但当该线程暂停进行 I/O 操作(例如等待数据库查询结果)时,另一个线程开始工作。这种快速来回切换充分利用了您的 RAM 限制,并保持 CPU 繁忙。

因此,通过Puma 实现多线程,这也是 Rails 应用程序中默认使用的应用服务器。


4
最高效的慢I/O方法是使用事件驱动I/O。事件驱动服务器可以处理数万个连接(与线程服务器不同)。 - Sergio Tulentsev
@Rohan 它也是Rails在生产环境中的默认服务器吗? - nxmohamad
是的..从Rails 5开始,它是开发和生产的默认服务器,但是您也可以使用其他服务器进行生产。 - Rohan
1
Webrick一直是一个多线程服务器,你可以在server.rb代码库和git历史中检查(create_thread方法调用)。我提交了一个纠正这个问题的答案。 - lzap
Webrick不支持多线程,因为它在单个Ruby进程中运行,而Ruby本身也不支持多线程。很多评论都很糟糕,让人害怕。事件驱动I/O与这种“缓慢”的问题完全无关。 - Lothar
Webrick是多线程的,它使用多个UNIX pthreads。全局锁不允许并行,但确实允许其他线程执行,而另一些线程正在等待I/O。多线程Ruby Web服务器将比单线程服务器性能更好。这些都是事实。 - lzap

6
这是一个针对Ruby on Rails开发人员而非广泛受众的问题,因为我不明白除了将开发环境靠近Puma稳定选择之外的原因。
然而,为了纠正当前答案,我必须说Webrick一直都是多线程Web服务器。它现在随Ruby语言一起发布(也提供了一个rubygem)。对于开发或低规模生产环境,它绝对足够用来服务Rails应用程序。
另一方面,它不像其他Web服务器(如Puma)那样可配置。此外,它基于老派的每个请求一个线程的设计。这在负载过重时可能会导致创建过多的线程。现代Web服务器通过使用线程池、工作进程或两者的组合或其他技术来解决这个问题,包括Puma。然而,在开发中为每个请求生成一个新线程完全可以接受。
我对任何一种都没有偏见,它们都是优秀的Ruby Web服务器,在我们的项目中,我们实际上在生产中同时使用它们两个。无论如何,如果您喜欢使用Webrick进行RoR开发,确实仍然可以使用它。
rails server webrick

你在这里受到了 Ruby 术语的困扰。Ruby 线程不是 CPU 线程,它们是纤程。它们不允许并行处理。 - Lothar
我猜你的评论是愚人节玩笑。Ruby中的线程确实是普通线程:https://ruby-doc.org/core-2.5.0/Thread.html,实现为UNIX pthreads:https://github.com/ruby/ruby/blob/master/include/ruby/thread_native.h,值得注意的是Fiber也可用:https://ruby-doc.org/core-2.5.0/Fiber.html。 - lzap
仍存在GIL/GVL问题,但在这种情况下(开发框架),线程提供的环境已经足够好了。我发布这篇文章的整个意图是,webrick经常被错误地标记为单线程。这不是事实。 - lzap

0

Rails 6.1小更新:

rails server -u webrick [-p NNNN]

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