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