流氓Ruby进程消耗所有CPU。 Ruby on Rails由Phusion Passenger提供服务

时间:2012-08-24 10:34:44

标签: ruby-on-rails ruby gdb passenger

我们遇到了Passenger在Apache上提供服务的RoR应用程序的问题。应用程序在启动时或者重新启动Apache时很好,但是在一段可变的时间之后我们开始看到消耗所有可用CPU的ruby进程。

有时这些过程会显示乘客身份,有时则不会。它们总是出现在顶部,占用了所有的CPU。 这些逐渐积累,永远不会被乘客杀死。

我尝试过以下诊断:

strace的:

每当我对他们进行战斗时,他们都没有输出。如果我从乘客状态将strace附加到健康的ruby进程,那么我可以看到有关该进程正在执行的操作的信息。这是流氓过程的输出:

strace -f -p 8648
Process 8648 attached with 2 threads - interrupt to quit
[pid  8650] select(6, [5], NULL, NULL, NULL

I'll then go into top and the thread is sigging at 88%. When I o back to strace.. there is nothing. Just the following output:
strace -c -p 8648
Process 8648 attached - interrupt to quit
^CProcess 8648 detached

GDB:

我针对其中一个流氓进程运行了以下命令:

sudo gdb
attach 12345     <--- replace "12345" with the actual PID

线程全部应用bt

然后我得到了这个github gist所描述的输出:https://gist.github.com/3448635

ruby​​_gdb:

我在pusewicz / ruby​​-gdb下使用了github上的ruby_gbd宏 然后跑了:

sudo gdb /path/to/ruby PID

在gdb中:我试图运行以下命令:

session-ruby
redirect_stdout # redirects gdb output to /tmp/ruby-debug.PID   
eval "caller"   # dumps backtrace

但是当我尝试将进程输出重定向到std_out时,它似乎终止了进程,因为我之后无法运行eval'calller'。

/tmp/ruby-debug.12840中没有输出(文件不存在)但是我确实在Apache error_log中找到了这个。此条目是指我尝试调试的进程(PID = 12840)...但是我不确定此错误是指进程正在执行的操作还是我尝试重定向std_out时遇到的问题

可以在这里找到实际的堆栈跟踪:https://gist.github.com/3448744

SIGABRT

我也试过用SIGABRT信号杀死线程。遗憾的是,日志中没有显示任何内容。

应用程序版本:

Phusion Passenger 3.0.11, 红帽linux Ruby 1.9.3-p125 Rails 3.1.3

我真的很感激任何帮助。我已经通过邮件列表和论坛搜索试图找到答案但尚未取得任何成功。 谢谢, 伊恩

0 个答案:

没有答案