puma 工作人员与单独的 EC2 实例

itw*_*lal 1 ruby ruby-on-rails puma puma-dev

我来自 Java/Tomcat 堆栈,并且是 RoR 堆栈的新手。我试图了解有关 puma 配置的一些概念。我已经读过这篇这篇,但我仍然不清楚工人术语。

据我所知,工作人员会导致子进程运行 puma。因此,本质上,这允许您在使用多核实例时实现并行性。但是您也可以通过启动尽可能多的 ec2 单核实例来实现相同的目的吗?

另外,如果实例不是多核,那么将工人设置为> 0是否有意义。

这里的任何信息都会对我有很大帮助。谢谢!

小智 5

在 Puma 的上下文中,工作线程和线程都用于实现并发,以便 Puma 可以处理请求,而不必总是等待先前的请求完成。良好的配置需要在工作线程数量和线程数量之间找到良好的平衡,并且需要考虑已部署应用程序的几个方面:

  • 工人:

    • 由于每个分叉进程都需要自己的内存,因此内存开销更大(由于(https://en.wikipedia.org/wiki/Copy-on-write),这在 Linux 上得到了缓解,但仍然是一个因素)
    • 当多个核心可用时允许并行性。当处理请求计算量很大时,这主要是一个问题 - 这是需要避免的 - 如果请求需要执行一些繁重的计算,那么最好使用类似的库将其移至后台作业(https://github.com/姆珀勒姆/西德基克
    • 不能在 JRuby 上使用,因为它不支持分叉
  • 线程数

    • 将为每个工作进程运行配置的线程数量 - 这意味着如果您有workers x,那么您将获得请求处理线程threads y总数x * y
    • 共享内存,以便它们具有更小的内存占用量(尽管这里也存在问题:(https://www.speedshop.co/2017/12/04/malloc-doubles-ruby-memory.html
    • 在默认的 Ruby 实现 MRI 上,由于 GIL,线程不允许并行执行 Ruby 代码 - 这不应该是一个大问题,因为 GIL 在等待 IO 期间不会被锁定,而这正是大量执行的地方将花费时间 - 访问数据库、与 API 通信等。
    • 在JRUBY上线程可以实现并行性。
    • 如果您的应用程序不是线程安全的,则无法使用。Rails 本身是线程安全的,但您无法保证应用程序依赖的任何 3d 方代码或应用程序代码本身。如果应用程序不是线程安全的,那么这里的答案很简单 - 不要使用线程(意味着将最小和最大线程配置为 1)。在缺乏线程安全性的情况下,即使在单核实例上,多工作线程配置也有意义。
    • 对于任何数量的线程,您都需要确保连接池中有足够的数据库连接。这通常意味着将 Rails 连接池大小设置为工作进程中运行的线程数。

将多个工作线程与部署到多个 EC2 实例进行比较忽略了一部分:当将 Puma 与多个工作线程一起使用时,有一个主 Puma 进程监听端口并将每个请求路由到可用的工作进程。当您有多个 EC2 实例时,您需要以某种方式处理它们之间的负载平衡 - 对于 AWS,可能是 ELB 或 ALB。部署到多个实例和负载平衡是部署任何重要 Web 应用程序的正确方法,但这不应阻止您通过工作线程和线程更好地利用实例资源。

我建议尝试配置工作线程和线程,首先将工作线程的核心数和线程数设置为 10,然后在遇到内存使用问题或资源利用率不足时进行调整。