我们遇到了Passenger在Apache上提供服务的RoR应用程序的问题。应用程序在启动时或者重新启动Apache时很好,但是在一段可变的时间之后我们开始看到消耗所有可用CPU的ruby进程。
有时这些过程会显示乘客身份,有时则不会。它们总是出现在顶部,占用了所有的CPU。 这些逐渐积累,永远不会被乘客杀死。
我尝试过以下诊断:
每当我对他们进行战斗时,他们都没有输出。如果我从乘客状态将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
我在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信号杀死线程。遗憾的是,日志中没有显示任何内容。
Phusion Passenger 3.0.11, 红帽linux Ruby 1.9.3-p125 Rails 3.1.3
我真的很感激任何帮助。我已经通过邮件列表和论坛搜索试图找到答案但尚未取得任何成功。 谢谢, 伊恩