ApacheでPassengerが提供するRoRアプリケーションに問題があります。アプリは起動時またはApacheの再起動時に問題ありませんが、さまざまな時間が経過すると、使用可能なすべてのCPUを消費しているrubyプロセスが表示され始めます。
これらのプロセスは、乗客のステータスで表示される場合と表示されない場合があります。それらは常に一番上に表示され、すべてのCPUを占有します。これらは徐々に蓄積し、乗客に殺されることはありません。
私は次の診断を試みました:
Strace:
私がそれらに対してstraceを実行するたびに、それらから出力が出ることはありません。乗客ステータスから正常なルビープロセスにstraceをアタッチすると、そのプロセスが実行していることに関する情報がログに記録されているのを確認できます。不正なプロセスからの出力は次のとおりです。
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:
これらの不正なプロセスの1つに対して次のコマンドを実行しました。
sudo gdb
attach 12345 <--- replace "12345" with the actual PID
スレッドはすべてのbtを適用します
次に、このgithubの要点で説明されている出力を取得しました: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に出力がありませんでした(ファイルは存在しませんでした)が、Apacheerror_logでこれを見つけました。このエントリは、デバッグしようとしたプロセスを参照しています(PID = 12840)…ただし、このエラーがプロセスの実行内容を参照しているのか、std_outをリダイレクトしようとしたときに発生した問題を参照しているのかはわかりません。
実際のスタックトレースは、要点で見つけることができます:https ://gist.github.com/3448744
SIGABRT
また、SIGABRTシグナルでスレッドを強制終了しようとしました。残念ながら、ログには何も表示されません。
アプリケーションバージョン:
Phusion Passenger 3.0.11、Red Hat linux Ruby 1.9.3-p125 Rails 3.1.3
私はこれで本当に助けていただければ幸いです。私はこれに対する答えを見つけようとしてメーリングリストやフォーラムを調べましたが、まだ成功していません。ありがとう、イアン