Itwarilal
我来自Java / Tomcat堆栈,并且是RoR堆栈的新手。我正在尝试了解有关puma配置的一些概念。我已经读过这个和这个,但是我对工人的术语还不清楚。
我了解到,工人会导致运行彪马的孩子进程。因此,从本质上讲,当使用多核实例时,可以实现并行性。但是,您也可以通过启动许多ec2单核实例来做同样的事情吗?
另外,如果实例不是多核的,则将worker设置为0是否有意义。
这里的任何信息将极大地帮助我。谢谢!
斯维特林·西蒙扬
在Puma的上下文中,工作程序和线程都用于实现并发性,因此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实例时,则需要以某种方式照顾它们之间的负载平衡-对于可能是ELB或ALB的AWS而言。部署到多个实例和负载平衡是以任何方式部署任何严重的Web应用程序的正确方法,但这不应该阻止您通过辅助线程和线程更好地利用实例资源。
我建议尝试配置工作程序和线程,并开始将工作程序的核心和线程数设置为10-然后在遇到内存使用问题或资源利用率不足时进行调整。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
编辑于
我来说两句