【问题标题】:Passenger spawning new ruby instances on Ajax calls乘客在 Ajax 调用中产生新的 ruby​​ 实例
【发布时间】:2011-03-16 22:19:09
【问题描述】:

Passenger 和 ajax 调用存在一些严重的性能问题。似乎每次我进行 ajax 调用时,都会启动一个新的 ruby​​ 实例,而不是使用响应原始页面请求的实例,这使得它非常慢。可以在几秒钟内发出多个 ajax 请求这一事实并没有使情况变得更好。

我调用的动作本身很慢(它会生成一个 PDF,通常需要 5-10 秒),但是通过 Ajax 调用时,响应时间是 1-3 分钟!这在我的开发环境中没有问题,因为我使用的是单个 mongrel 实例,但是这里的Passenger 确实有问题。

我尝试了for this SO question 提供的 Apache/Passenger 选项,但没有成功。

有遇到过类似问题并找到解决方法的人吗?

【问题讨论】:

    标签: ruby-on-rails ruby passenger


    【解决方案1】:

    您何时触发 AJAX 请求?也许它与页面加载重叠?

    在触发 AJAX 请求之前等到 DOM load 事件可能会有所帮助。

    【讨论】:

    • 当用户点击按钮时请求被触发。无论整个页面是否已加载,它都很慢。据我了解,瓶颈在于Passenger 为每个请求启动一个新的ruby 实例。也许我应该限制工作线程的最大数量。
    【解决方案2】:

    其实答案就在于问题。问题在于,Passenger 生成了许多新的应用程序实例,而不是使用现有的池。所以解决这个问题的一种方法是设置最大工人数:

    PassengerMaxPoolSize 2
    

    这解决了我的问题,并将响应时间缩短到原来的 10%-25%。

    更新

    更好的方法是限制可以处理单个用户的工作人员数量。这是我最终使用的方法:

    PassengerMaxInstancesPerApp 1
    

    【讨论】:

    • 您确定这是一个好方法吗?随着用户的增长,您也希望增加池大小。
    • 这是一个内部系统,同时用户很少,但这些用户的交互性很高。如果这造成问题,我会考虑堆叠请求并增加池大小。
    猜你喜欢
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    相关资源
    最近更新 更多