在capistrano部署后,Rails app(Nginx / Passenger)冻结了20多分钟

时间:2014-07-23 15:53:31

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

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

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

  • 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以便快速部署?

1 个答案:

答案 0 :(得分:0)

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

诊断此问题的最佳方法是找出您的应用正在做什么。阅读the Phusion blog以了解如何执行此操作。特别是,您可以使用SIGQUIT技巧为您的流程获取回溯。

您还可以运行passenger-status --show=requests以查看您的应用所针对的请求。