美洲狮工人vs单独的ec2实例

时间:2019-02-04 21:29:51

标签: ruby-on-rails ruby puma puma-dev

我来自Java / Tomcat堆栈,并且是RoR堆栈的新手。我正在尝试了解有关puma配置的一些概念。我已经读过thisthis,但对于工作人员的用语仍然不清楚。

我了解到,工作人员会导致运行puma的子进程。因此,从本质上讲,当使用多核实例时,可以实现并行性。但是您也可以通过启动许多ec2单核实例来做到这一点吗?

如果实例不是多核的,则将worker设置为0还是有意义的。

这里的任何信息都会极大地帮助我。谢谢!

1 个答案:

答案 0 :(得分:1)

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

  • 工人:

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

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

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

我建议尝试对worker和线程的配置进行实验,并开始将worker的核心和线程数设置为10-如果遇到内存使用问题或资源利用率不足的情况,请进行调整。