3

在 Apache 上,Passenger 服务的 RoR 应用程序存在问题。该应用程序在启动或 Apache 重新启动时很好,但经过一段时间后,我们开始看到正在消耗所有可用 CPU 的 ruby​​ 进程。

有时这些过程会以乘客状态显示,有时则不会。它们总是出现在最前面,占用了所有的 CPU。这些逐渐建立起来并且永远不会被Passenger杀死。

我尝试了以下诊断:

追踪:

每次我对它们运行 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

数据库:

我对这些流氓进程之一运行了以下命令:

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

线程应用所有 bt

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

ruby_gdb:

我使用了在 github 上的 pusewicz/ruby-gdb 下找到的 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 'caller'。

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

可以在此处的要点中找到实际的堆栈跟踪:https ://gist.github.com/3448744

SIGABRT

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

应用版本:

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

我真的很感激这方面的任何帮助。我翻遍了邮件列表和论坛,试图找到这个问题的答案,但还没有成功。谢谢,伊恩

4

0 回答 0