我的最高级别的问题是,我如何让彪马停止失败。 但是,这确实是由许多较小的问题组成的。 我会给他们每个人号码和大胆,试图使这个问题负责。
我在一个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关于这个问题的很好的资源。
这就是我所学到的 –
回答我原来的问题 –
与彪马的事情是,它是唯一的主流项目,鼓励在MRI Ruby中使用线程(好吧,无论如何,Heroku鼓励)。
这就是为什么我们有时会看到在Puma上工作的人们关于人们如何看待Puma有各种问题的说法,而问题在别处,而且它只影响Puma:P
“我们”在过去发现并修复了一些非常怪异和令人讨厌的Ruby GC问题,这些问题是关于红宝石核磁共振(Ruby MRI)中线程繁重使用的一些奇怪的角落案例( http://blog.skylight.io/hunting-for-leaks-红宝石/ ),谁能说这不是人们归咎于Puma这种怪异问题的最后一个?
尝试禁用线程一段时间,看看它是怎么回事,让我们知道,也许兔子在那里,再次
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主进程来管理它们,向它们传递数据,启动他们,停止他们,渠道日志等