首页 > 解决方案 > puma 工人与单独的 ec2 实例

问题描述

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

我了解工人导致子进程运行 puma。因此,在使用多核实例时,基本上这可以让您实现并行性。但是您也可以通过启动尽可能多的 ec2 单核实例来做到这一点?

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

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

标签: ruby-on-railsrubypumapuma-dev

解决方案


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

  • 工人:

  • 线程

    • 将为每个工作进程运行配置的线程数量 - 这意味着如果你有workers x然后threads 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 实例时,您需要以某种方式处理它们之间的负载平衡 - 在 AWS 的情况下,它可能是 ELB 或 ALB。部署到多个实例和负载平衡是部署任何严肃的 Web 应用程序的正确方法,但这不应阻止您通过工作线程和线程更好地利用实例资源。

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


推荐阅读