Phusion Passenger并不总是使用Rails进行NonBlocking操作?

时间:2010-07-19 19:03:26

标签: ruby-on-rails passenger

Passenger如何决定何时分叉新进程,并且我可以以任何有意义的方式配置它应该处理多少个进程(除了配置中的“智能”和“保守”标志?)或者,有没有办法调试为什么在Phusion下运行的rails应用会突然冻结?

背景

我正在使用Phusion Passenger和Apache2服务器,而且在大多数情况下,事情都很好。我不太关心加载,更关心阻塞:如果遇到长控制器方法(例如,一种睡眠时间为十秒的方法),常规杂种会占用整个应用程序,并且除非其他网页可以提供服务。该方法已经完成。使用Passenger,我可以使用相同的方法,并且仍然可以打开一个新的浏览器,并且可以更快地加载相同应用程序的加载页面。

SOMETIMES。

并且“有时”是一个问题。如果一个方法需要足够长的时间(在我的情况下,外部网络调用永远不会回来),整个应用程序将再次挂起,即使所有spiffy线程分叉,或者其他任何东西......

我的理解是,Passenger的工作方式是,它每次需要时都会分离整个新的rails实例,通常是在一次连接太多人的情况下。

它似乎可以使用长方法,但是......但我看不到任何关于如何或为什么(或更重要的是,如何调整或配置此过程)的引用。或者甚至如何弄清楚问题可能是什么(我是否需要让Phusion分叉更多线程,它是否在一段时间内不能使用长方法?)

1 个答案:

答案 0 :(得分:0)

每当Phusion Passenger发出请求时,决定将请求转发到哪个进程并将该进程标记为忙。处理完请求后,该进程会被标记为非忙碌。

如果所有现有进程都标记为忙,则Phusion Passenger将生成一个新进程,除非达到MaxPoolSize限制,在这种情况下它将等待进程变为非忙碌。

您想要自定义什么? “冻结”究竟是什么意思?你是指“慢Mongrel队列问题”吗? Phusion Passenger有一个名为Global Queuing的功能,可以解决这个问题。问题及其解决方案是Phusion Passenger手册中的documented extensively,从版本3.0.0 beta开始,默认情况下会启用此选项。