我的顶级问题是,我怎样才能让Puma停止失败。但这确实是由很多小问题组成的。我会给每个人编号并加粗,试着让这个问题回答。
我在EC2实例上托管一个Rails应用程序,它是一个t2.nano。诚然,这是一个非常小的盒子 - 但我不希望我的网站接收任何流量。我使用Capistrano和Capistrano Puma成功配置了Nginx和Puma。一切都很棒,直到有一天我去了我的网站,看到了Nginx 504消息。
我打开了Nginx错误日志,发现它无法连接到Puma:
connect() to unix:/home/deploy/myapp/shared/tmp/sockets/puma.sock failed (111: Connection refused) while connecting to upstream, client: xxx.xxx.xxx.xxx, server: localhost, request: "GET / HTTP/1.0", upstream: "http://unix:/home/deploy/myapp/shared/tmp/sockets/puma.sock:/500.html", host: "myapp.com"
调试这个,我了解到Puma已经停止运行了。这就是为什么Nginx无法连接到它。我认为这里有两个问题:第一,是Puma不应该停止运行。服务器很小,但没有流量。第二,是当Puma失败时,它应该优雅地重启。但是,我现在只关注第一个问题。因为如果Puma不断重启,有时它会以严厉的方式杀死这个过程似乎是合理的。
为了调试这个,我打开了htop。果然,机器运行时没有任何内存。这是有道理的 - 我在一台小机器上运行数据库,rails app,webserver和memcache。它一直在耗尽内存并杀死Puma。
我研究了我与Capistrano建立的Puma配置。在config / deploy.rb中,我有这些行 -
set :puma_threads, [0, 8]
set :puma_workers, 0
我读了所有关于puma_workers和puma_threads的内容。我还了解到Nginx有自己的工作人员。 Puma流程非常昂贵。 Puma酷的原因在于它是正确的多线程 - 因此独立的过程非常棒。听起来每个工作者都有自己的一组线程 - 所以如果有4个工作线程有8个线程,那么将有32个进程。但就我而言,我想要使用很少的内存。 2个过程对我来说听起来不错。 1。我对工人和线程的理解是否正确?
我更新了我的config / deploy.rb文件并进行了部署,其中0 puma_workers和min = 0,max = 2个线程。
看来Nginx的配置存在于:/etc/nginx/nginx.conf。 Puma的配置就在这里:/home/deploy/myapp/shared/puma.rb。我本来希望我在config / deploy.rb中的更新让Capistano编辑配置文件。没有运气 - 我的最小,最大线程仍然设置为0.8。 2。使用Capistano时尝试通过config / deploy.rb更新这些值是否正确?
另外 - 我打开了nginx.conf并看到了worker_processes 4;
。 3。当我安装Nginx或Capistano设置此默认设置时,此设置为4吗?
我打开了htop,果然我有很多Puma程序。因此,我手动编辑了配置文件并重新启动了Puma和Nginx。
我将Nginx工作者的数量从4改为1.在htop中,这很有效。我现在只有1个Nginx工作者。然而,Nginx工作者从来都不是非常昂贵(与Puma线程相比)。所以我认为这不重要。
但是,仍然有超过2个Puma线程 - 有6个。在一个百灵鸟上,我将最小线程数从0更改为1 - 认为0不是可能的数字所以也许它&#39 ; s设置默认值。这将Puma进程的数量增加到9.我也尝试将puma_workers的数量更改为1,原因相同,并且进程数量增加。 4。拥有0个线程和/或工作人员意味着什么?
然后我试图手动杀死其中一个美洲狮进程(sudo kill xxxxx),然后所有的Puma进程死亡。
5。如果只有2个美洲狮过程,我该怎么做?
正如你所看到的,我对彪马的理解并不是很好,Puma与Nginx和Capistano接触的界限并不清楚。任何帮助是极大的赞赏。我还没有找到关于这个问题的大量资源。
答案 0 :(得分:0)
这就是我所学到的 -
回答我原来的问题 -
答案 1 :(得分:0)
与Puma的关系是,它是唯一鼓励在MRI Ruby中使用线程的主流项目(好吧,无论如何,Heroku鼓励)。
这就是为什么我们有时会看到彪马工作人员关于人们如何认为彪马有各种各样的问题的陈述,而问题出在其他地方,而且只是彪马:P
"我们"在过去发现并修复了一些非常怪异和令人讨厌的Ruby GC问题,这些问题是关于Ruby MRI中线程的重负荷使用以及一些怪异的角落情况(记得http://blog.skylight.io/hunting-for-leaks-in-ruby/),并且说这不是最后一个这样的怪异人们归咎于Puma的问题?
尝试禁用线程一段时间,看看它是怎么回事,让我们知道,也许兔子在那里,再次
puma.rb
选项:https://github.com/puma/puma/blob/master/examples/config.rb 在Thread pool
下,文档解释了如何设置工作线程数。请记住,Puma主要是JRuby的东西和MRI支持& forking仅在稍后作为事后补充添加,文档中的配置条目的排序(如何在设置分叉之前设置线程)是这样做的结果。
文档声明:
Puma使用您可以修改的动态线程池。您可以使用-t(或--threads)标志设置池中可用的最小和最大线程数:
Puma 2提供了集群模式,除了已经提供的线程外,还允许您使用分叉进程同时处理多个传入请求。
意思是,Puma总是会线程,它是什么,如果你告诉它做0/1线程,它会做1个线程,所以它可以处理请求。
此外,如果您将工作人员(流程)的数量设置为> 1,Puma将以" Clustered mode"这意味着它将fork,每个fork将会线程化,
即。 -w 3 -t4:4
将导致3个进程每个运行4个线程,允许您同时服务12个请求。
Puma文档没有说明Puma将为其内部使用的流程和流程,但只是一个有根据的猜测是,它至少需要运行所有工人+ 1个主流程管理它们,向它们传递数据,启动它们,阻止它们,引导它们的日志等。