【问题标题】:Passenger stalls with a large amount of simultaneous requests有大量同时请求的乘客摊位
【发布时间】:2010-10-16 22:46:24
【问题描述】:

我在使用我们的 Rails 3 应用程序之一时遇到了问题。当大量请求发送到服务器(10 / 秒)时,整个服务器停止。我尝试了很多不同的乘客设置,有时我注意到略有改善,但没有一个最终成为解决方案。

我的设置:

  • 英特尔 i7(8 核)
  • 8GB 内存
  • Ubuntu 10.04 服务器
  • Ruby 1.9.2
  • 导轨 3
  • Apache 2.2.14
  • 乘客 2.2.15
  • MySQL 5.1.41

我当前的passenger.conf:

PassengerMaxPoolSize 12
乘客使用全局队列开启
乘客高性能
RailsS​​pawnMethod 智能
乘客最大请求数 5000
乘客StatThrottleRate 5
RailsAppSpawnerIdleTime 0
乘客池空闲时间 600

此服务器专用于一个应用程序。好吧,一个处于暂存和生产模式的应用程序。

我尝试使用 PassengerMaxPoolSize,将其设置为 4、12、20、40、80,...奇怪的是,Passenger 似乎产生了比定义的 MaxPoolSize 更多的应用程序。目前它设置为 12,但在 htop 中我至少可以找到其中的 34 个:

1234 用户名 20 0 260M 97572 3892 S 0.0 1.2 0:00.13 机架:/var/www/domains/domain.com/current

只需在我们应用的根页面上打开 30 个标签,我就可以轻松复制此问题。前 10 个左右会立即加载,其余的至少需要一分钟才能呈现。

我没有想法。有人知道如何解决这个问题吗?

【问题讨论】:

    标签: ruby ubuntu ruby-on-rails-3 passenger


    【解决方案1】:

    Phusion Passenger 可能正在尝试生成更多进程,但在生成期间它无法响应请求。试试实现异步生成的 Phusion Passenger 3。

    【讨论】:

    • 好的,太好了!这解决了悬挂问题。但是现在apache有时会抛出500。如果我真的很快打开十个标签,一两个是 500(apache 500,不是 rails)。最后点击刷新然后加载页面。知道这可能是什么吗?感谢您的帮助!
    • 例如,当生产应用程序运行一段时间并且我重新启动临时应用程序时,也会发生这种情况。这些错误随后出现在生产和登台中。或者当它很安静并且我们开始一个 Stumble 露营时,所以突然有很多游客同时到达。
    • 我回到了 2.2.15。至少挂起的请求最终会活跃起来。而在乘客 3 上,我收到很多 500 错误。
    • 您应该查看错误日志。这可能会告诉你为什么它给出 500s。
    • 经过大量测试,这是我使用乘客 3.0.0 得到的结果:[ pid=18388 thr=140460635584320 file=ext/apache2/Hooks.cpp:859 time=2010-10-21 11:28:43.291]:mod_passenger 中的意外错误:无法连接到 Unix 套接字'/tmp/passenger.1.0.6759/generation-0/socket':没有这样的文件或目录 (2) 回溯:在'Passenger::ApplicationPool ::Client* Passenger::ApplicationPool::Client::connect(const std::string&, const std::string&, const Passenger::StaticString&)' (Client.h:446) in 'Passenger::ApplicationPool::Client * Hooks::getApplicationPool()' (Hooks.cpp:270)...
    【解决方案2】:

    检查您的 Rails 日志以确保它没有处理任何静态请求(图像、css、js 文件等)。如果是,那么每次页面加载都会通过乘客触发更多请求。

    如果是这种情况,您可以将 apache 配置为发送静态文件本身,而不是将所有请求转发给乘客。

    【讨论】:

    • 该应用程序反应灵敏。根据 newrelic,每个动作大约 100 毫秒。但是当太多的请求同时进来时,服务器就完全停止响应了。它可能需要几分钟才能再次响应。重新启动 apache 会有所帮助。当我检查内存状态和处理器使用情况时,大约 60% 的内存未使用,通常一个线程以 100% 运行(挂起),其他 7 个线程几乎为 0%。所以并不是资源被充分利用。看起来一项操作正在阻止 Apache 或Passenger。
    • 那去红利的回答,他就知道了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多