1

実行中のdelayed_jobプロセスを監視して、メモリを使いすぎていないことを確認するようにmonitをセットアップしました。これは最初、プロセスが 700MB を超えた場合に再起動するように設定されていたため、monitrc ファイルの関連部分は次のようになりました。

check process delayed_job_worker
  with pidfile /path/to/pidfile.pid
  start program = "/usr/bin/dj start" with timeout 60 seconds
  stop program = "/usr/bin/dj stop" with timeout 60 seconds
  if totalmem is greater than 700 MB then restart

これは期待どおりに機能していましたが、delayed_job が削除されていないため、ワーカーが再起動された後、別のワーカーが来てジョブを取得し、delayed_job がこれを処理しますが、ジョブはリソースを使用して数回処理されるため、遅延を削除したいと思いますこの場合の仕事。私の解決策は次のようになります。

check process delayed_job_worker
  with pidfile /path/to/pidfile.pid
  start program = "/usr/bin/dj start" with timeout 60 seconds
  stop program = "/usr/bin/dj stop" with timeout 60 seconds
  if totalmem is greater than 700 MB then
exec "/path/to/script/kill_and_remove_dj /path/to/pidfile.pid"

スクリプトが実行されると、このスクリプトは pidfile から pid を取得し、それを強制終了し、Rails ランナーを介して ruby​​ スクリプトを実行して、pid からdelayed_job を見つけ、データベースから削除します。ps aux | grep kill_and_remove_djこれはすべて期待どおりに機能しているように見えますが、メモリ制限に達することがわかっているジョブを作成した後に気付いたことは、コマンドが何度も実行されていることです。

私の理解では、この場合の totalmem は、pid およびすべての子プロセスからのプロセスのメモリになります。exec がスクリプトを実行すると、完全に別のプロセスの下になります。この問題の原因について考えている人からのポインタや情報を探しているだけです。必要に応じて、さらに情報を提供させていただきます。

4

0 に答える 0