2011-09-16 9 views
3

私は現在cronと "rails runner"を使ってバックグラウンドジョブを実行しています。ほとんどの場合、これらの仕事は単純な投票です。「リマインダーメールを受信する予定のレコードを検索してください。そのメールを送信してください。cronジョブに「レールランナー」を使用すると、CPU使用量が非常に多くなります。

私はAmazon EC2 Smallインスタンスを見ていて、これらのcronジョブが実行されるたびにCPUが〜99%に上昇することに気付きました。私の現在の仕事の中の小さな小さな質問は、確かにではなく、です。私はスパイクが単に "レールランナー"を介してフルレール環境をロードする努力のためであると推測しています。

定期的にスケジュールされたバッチジョブを処理するCPU効率の良い方法はありますか?

P.S.私は、将来の時刻Xでリマインダ電子メールを送信する特定の例では、delayed_jobsを実行し、将来的にジョブをスケジュールすることができることを知っています。すべての可能なタスクがdelayed_jobsフレームワークにはうまく収まっているわけではないので、私はより伝統的な "cron job"タイプのソリューションを探しています。 "レールランナー"のように、狂ったCPUの影響はありません。

答えて

2

労働者の魔法使いはレールをロードできませんenv。または、一度だけロードしてください(resqueなど)

+0

ありがとうございます! ResqueはDelayed Jobsに代わるもののように見えますが、「レールランナー」に代わるものです。たとえば、遅延ジョブの場合と同じように、「一定の間隔でこのジョブを実行する」ではなく、「このジョブを時間Xで1回実行する」という条件を満たしているようです。 – cailinanne

+0

ループ実行とスリープでインターバル実行ジョブを作成することもできます。私はループを使用します。そして、resqueは私に労働者を監視するための "resque-web"を与えます – Falcon

+0

ありがとう!私はちょうど私が必要とするかもしれない "resque - スケジューラ"を見つけました。 https://github.com/bvandenbos/resque-scheduler – cailinanne

0

扱うものを処理するためにRails環境をロードする必要があるため、これには解決策はないと思います。だから、 "cron"モデルでは、ハンドラを起動して、インスタンスに負荷をかけることになります。私はクラウドサービスがこれにどのように役立つのかわかりませんが、あなたの場合の最適なモデルは、ジョブの処理のためにREEと結合されたジョブ処理とフォークの実行デーモンを持つことです(実行ループの終わりに死ぬ子プロセスで可能な限り多くの場合)。

デーモンは、特定の処理を行うジョブをスピンオフする信号(ジョブキュー経由でも)を受け入れるように設定できます。

+1

Hmmm。私は、ジョブ内のコードを実行するアプリケーションの管理用の「ページ」を作成することができます。 cronジョブは、wgetを介してそのページを要求することができます。その利点は、すでに生きているApache/Passenger Rails環境でジョブが実行されることです。 – cailinanne

関連する問題