Resque.before_fork
私たちの問題は、私たち自身のカスタムとResque.after_fork
ハンドラーを持っていることが原因であることが判明しました。
NewRelicのRPMgemは、ワーカーResque.before_fork
とのフックを自動的にセットアップしResque.after_fork
、ワーカーの通信チャネルを確立します。Resqueの制限として、before_forkフックとafter_forkフックに最後に割り当てられたブロック/Procのみを実行します。したがって、独自のカスタムbefore_fork / after_forkフックがある場合は、エージェントの通信チャネルを手動で設定する必要があります。たとえば、config / initializers/custom_resque.rbファイルで設定します。
Resque.before_fork do |job|
NewRelic::Agent.register_report_channel(job.object_id)
# extra custom stuff here
end
Resque.after_fork do |job|
NewRelic::Agent.after_fork(:report_to_channel => job.object_id)
# extra custom stuff here
end
このコードは、RPMGemのファイルから直接取得されますgems/newrelic_rpm-3.5.0/lib/new_relic/agent/instrumentation/resque.rb
RPMバグアップデート2012/12/27:上記の手法を展開した後、フォークモード(Resqueなど)で使用すると、RPMGemがファイルハンドルをリークすることがわかりました。この種のエラーメッセージが表示されましたActiveRecord::StatementInvalid: ArgumentError: too large fdsets: SET client_min_messages TO ''
。多くの調査の結果、これらはActiveRecordがデータベース接続を開こうとしたときに発生し、ファイル記述子の数が不足しているために開くことができないことがわかりました。New Relicは、Explain Planをサンプリングするときに、エージェントにバグがあることを確認しました。これは、DBに接続する多くのResqueジョブが実行されるときに発生します。
バグ更新2013年1月28日:多くの頭を悩ませた後、このバグは、例外を除いてResqueジョブを停止する可能性のあるResqueのフックを使用するresque-lonely_jobgemとのサポートされていない相互作用が原因であることがわかりました。この状況では、RPMクライアントは適切にクリーンアップされず、ファイル記述子がリークします。New Relicに通知され、修正に取り組んでいます。before_perform
Resque::Job::DontPerform
バグアップデート2013年4月10日:これは修正されました。3.6.0.78を使用しており、このケースを処理します。これ以上のファイル記述子のリークはありません!NewRelicに感謝します。