Puma停止运行在EC2实例上的Rails应用程序与Nginx(使用Capistrano / Capistrano Puma)

我的最高级别的问题是,我如何让彪马停止失败。 但是,这确实是由许多较小的问题组成的。 我会给他们每个人号码和大胆,试图使这个问题负责。

我在一个t2.nano的EC2实例上托pipeRails应用程序。 无可否认,这是一个非常小的盒子,但我不希望我的网站收到任何stream量。 我用Nist和Puma使用Capistrano和Capistrano Puma成功地configuration了一切。 一切都很好,直到有一天我去了我的网站,看到了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"

debugging这个,我知道Puma已经停止了运行。 这就是为什么Nginx无法连接到它。 我认为这里有两个问题:第一,彪马不应该停止运行。 服务器很小,但没有stream量。 第二,当Puma失败时,它应该优雅地重新开始。 不过,我现在只关注第一个问题。 因为如果彪马一直在重新启动,那么有时它会以严酷的方式杀死进程似乎是合理的。

为了debugging这个,我打开了htop。 果然,机器没有任何记忆地运行。 这是有道理的 – 我正在一台小机器上运行数据库,Rails应用程序,Web服务器和memcache。 它不断地耗尽内存并杀死Puma。

我看着我与Capistranobuild立的彪马configuration。 在config / deploy.rb中我有这些行 –

 set :puma_threads, [0, 8] set :puma_workers, 0 

我读了所有关于puma_workers和puma_threads。 我也了解到Nginx有自己的工作人员。 美洲狮过程非常昂贵。 让Puma很酷的是它是multithreading的 – 所以独立的进程是非常棒的。 这听起来像每个工人有自己的一套线程 – 所以如果有4个工人8线程,将有32个进程。 但就我而言,我想用很less的记忆。 2个过程听起来不错。 1.我对工作和线索的理解是否正确?

我更新了我的config / deploy.rb文件,并部署了0个puma_workers和min = 0,最大= 2个线程。

看起来Nginx的configuration在这里:/etc/nginx/nginx.conf。 Puma的configuration在这里:/home/deploy/myapp/shared/puma.rb。 我会期望我的更新config / deploy.rb有Capistano编辑configuration文件。 没有运气 – 我的最小,最大线程仍然设置为0,8。 2.使用Capistano时,通过config / deploy.rb尝试更新这些值是否正确?

另外 – 我打开了nginx.conf,看到了worker_processes 4;3.当我安装Nginx或者Capistano设置了这个默认值时,是否设置为4?

我打开htop,果然我有很多Puma进程。 因此,我手动编辑了我的configuration文件并重新启动了Puma和Nginx。

我把Nginx的工作人员从4个改为1个。看着htop,这个工作。 我现在只有1个Nginx工作者。 然而,Nginx的工作人员从来都不是非常昂贵(与Puma线程相比)。 所以我不认为这很重要。

然而,还有超过2个美洲狮线程 – 有6个。在百灵,我把线程的最小数量从0改为1 – 认为0不是一个可能的数字,所以也许它是设置一个默认值。 这将Puma进程的数量增加到了9.我也尝试将puma_workers的数量更改为1,出于同样的原因,进程的数量增加了。 4. 0个线程和/或工作人员意味着什么?

然后我试图杀死一个美洲狮进程手动(sudo杀xxxxx),然后所有的美洲狮进程死亡。

5.我需要做什么才能有两个美洲狮进程?

正如你所看到的,我对Puma的理解并不是很好,Puma与Nginx vs Capistano之间的界限并不清楚。 任何帮助是极大的赞赏。 我一直无法find关于这个问题的很好的资源。

这就是我所学到的 –

  • 如果Puma停止工作,请确保您有足够的内存来处理您指定的工人和线程的数量。 每个美洲狮过程都非常昂贵。
  • 如果您设置0个工作者,Puma将不会以群集模式运行。 建议使用群集模式运行MRI。
  • 线程是为每个集群设置的。 如果你有2个作品和0,8个线程,这意味着你将有两个作品,每个将有1到8个线程。
  • 除了线程之外,Puma还使用进程。 彪马有一个父进程的PID。 如果您正在使用集群模式,则它有一个PID来管理集群。 如果使用集群模式,则每个集群都有一个PID。 那么有一个固定数量的PID来运行其他任务(每个集群)。 没有集群模式,有5个固定的PID。 在集群模式下,有7个固定的PID。
  • 这就是所有的说法 – 如果你看到更多的进程超出你的预期,这就是为什么。 另外 – 当你添加一个新的工人,你会添加大量昂贵的流程。 确保你有空间。 我有一个小应用程序,事情似乎很好地工作,1个工人和最小= 1,最大= 4个线程。 有最多8个线程看起来是什么一直在为我杀死美洲狮。

回答我原来的问题 –

  1. 是的,上面的工作人员和线程的解释是正确的。
  2. capistrano-puma似乎只在第一次部署时才设置puma配置。
  3. 我认为nginx配置是在安装nginx时创建的。
  4. 0名工作人员意味着你正在运行美洲狮没有集群模式。 有0个线程是不可能的。 我相信0,8和1,8是一样的。
  5. 除了您请求的线程之外,Puma还需要运行进程。 只有2或3个PID运行是不可能的。 这些进程运行附加任务。

一个彪马的嫌疑犯悬而未决

与彪马的事情是,它是唯一的主流项目,鼓励在MRI Ruby中使用线程(好吧,无论如何,Heroku鼓励)。

这就是为什么我们有时会看到在Puma上工作的人们关于人们如何看待Puma有各种问题的说法,而问题在别处,而且它只影响Puma:P

“我们”在过去发现并修复了一些非常怪异和令人讨厌的Ruby GC问题,这些问题是关于红宝石核磁共振(Ruby MRI)中线程繁重使用的一些奇怪的角落案例( http://blog.skylight.io/hunting-for-leaks-红宝石/ ),谁能说这不是人们归咎于Puma这种怪异问题的最后一个?

尝试禁用线程一段时间,看看它是怎么回事,让我们知道,也许兔子在那里,再次

Docs解释线程与群集模式vs工作者

  • 线程池文档: https : //github.com/puma/puma#thread-pool
  • 群集模式文档: https : //github.com/puma/puma#clustered-mode
  • puma.rb选项: https : //github.com/puma/puma/blob/master/examples/config.rb

Thread pool ,文档解释了如何设置工作线程的数量。 请记住,Puma主要是JRuby,MRI支持和分支只是在事后才添加,文档中配置条目的顺序(如何在设置分叉之前设置线程)是这样做的结果。

文档状态:

Puma利用一个可以修改的动态线程池。 您可以使用-t(或–threads)标志设置池中可用的最小和最大线程数:

Puma 2提供了集群模式,除了已经提供的线程之外,还允许您使用分叉进程同时处理多个传入请求。

意思是说,Puma总是会线程,就是这样做的,如果你告诉它做0/1线程,它会做1个线程,所以它可以为请求服务。

此外,如果将worker(进程)的数量设置为> 1,Puma将以“Clustered模式”运行,这意味着它将fork,并且每个fork都将进行线程化,

-w 3 -t4:4将导致3个进程每个运行4个线程,允许您同时服务器12个请求。

Puma文档没有具体说明Puma将在内部使用哪些和多少进程,但只是一个受过教育的猜测,就是最低限度需要运行所有的worker + 1主进程来管理它们,向它们传递数据,启动他们,停止他们,渠道日志等