【问题标题】:Rails app (Nginx / Passenger) freezes up for 20+ minutes after capistrano deploy在 capistrano 部署后,Rails 应用程序(Nginx/Passenger)冻结了 20 多分钟
【发布时间】:2014-07-23 15:53:30
【问题描述】:

我有一个 Rails 4 应用程序遇到 capistrano 部署问题。每次 capistrano 部署后,Web 应用程序都会长时间挂起(http 请求处于暂停状态,无法通过浏览器访问网站),在某些情况下长达 20 甚至 30 分钟。

我认为部署是相当标准的。一般程序是:

  • git push 远程服务器的仓库
  • 标准capistrano :publishing
  • 使用capistrano/bundler捆绑安装
  • touch tmp/restart

Capfile 没有什么棘手的:

require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/bundler'

运行cap server deploy 成功完成并在大约 10 秒后返回。但是完成后,服务器会关闭并保持关闭(“冻结”)很长时间,直到它最终恢复并部署新版本。

在发生这种情况时,我可以 ssh 进入服务器(尽管提示非常迟钝),我可以看到它的所有资源都被 ruby​​ / Passenger RackApp 用完了:

顶部:

>top
PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
.. .. ..   ..  ..  . 50.1 18.4 ..    ruby
.. .. ..   ..  ..  . 49.8 18.7 ..    ruby
.. .. ..   ..  ..  . 49.9 21.1 ..    ruby
.. .. ..   ..  ..  . 49.5 20.9 ..    ruby

此服务器有两个内核,因此这是它所有可用的 CPU。

ps aux 显示了多个正在运行的 Passenger RackApp 实例:

>ps aux
USER PID  %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
user .... 11.0 18.3 ..  ..  ..  ..   ..    2:05 Passenger RackApp: /www/myRailsApp/current
user .... 12.1 18.3 ..  ..  ..  ..   ..    1:35 Passenger RackApp: /www/myRailsApp/current
user .... 12.1 20.3 ..  ..  ..  ..   ..    1:33 Passenger RackApp: /www/myRailsApp/current
user .... 14.7 21.0 ..  ..  ..  ..   ..    1:21 Passenger RackApp: /www/myRailsApp/current
user .... 5.6 12.5  ..  ..  ..  ..   ..    0:24 Passenger RackApp: /www/myRailsApp/current
user .... 5.8 6.6   ..  ..  ..  ..   ..    0:07 Passenger AppPreloader: /www/myRailsApp/current
user .... 0.7 7.6   ..  ..  ..  ..   ..    0:01 Passenger RackApp: /www/myRailsApp/current

乘客状态通常如下所示:

>passenger-status
Version : 4.0.41
Date    : 2014-07-23 15:25:11 +0000
Instance: 19086
----------- General information -----------
Max pool size : 6
Processes     : 3
Requests in top-level queue : 0

----------- Application groups -----------
/www/myRailsApp/current#default:


  App root: /www/myRailsApp/current
  Requests in queue: 0
  * PID: 3173    Sessions: 1       Processed: 1       Uptime: 3m 7s
    CPU: 70%     Memory  : 426M    Last used: 3m 7s ago
  * PID: 3194    Sessions: 1       Processed: 1       Uptime: 3m 1s
    CPU: 69%     Memory  : 361M    Last used: 3m 0s ago
  * PID: 3220    Sessions: 1       Processed: 1       Uptime: 2m 40s
    CPU: 67%     Memory  : 349M    Last used: 2m 39s ago

日志(nginx、rails)不显示任何内容。

版本:

Rails 4.1.0
nginx version: nginx/1.4.1
Passenger Version : 4.0.41
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]

我的主要问题是:

  1. 这里到底发生了什么?
  2. 如何才能更有效地诊断?
  3. 如何设置 capistrano 以使其快速部署?

【问题讨论】:

    标签: ruby-on-rails deployment nginx capistrano passenger


    【解决方案1】:

    Capistrano 部署中的某些内容似乎会导致您的应用(而不是 Passenger 本身)执行一些需要 20 分钟的繁重处理。您不仅可以在 CPU 使用率中看到,还可以在“Sessions: 1”标签中看到这一点。这意味着当时所有这些进程都在忙于处理请求

    诊断此问题的最佳方法是找出您的应用在做什么。阅读the Phusion blog 了解如何做到这一点。特别是,您可以使用 SIGQUIT 技巧来获取进程的回溯。

    您还可以运行 passenger-status --show=requests 来查看您的应用程序遇到了哪些请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多