« データベースをコピーするモジュール DBIx::Replicate | メイン | Tritonn (MySQL+Senna) の join を高速化 »

2008年01月30日

setlock を使って cron をぶんまわす方法

 事前計算や DB 再構築を手軽に実行するのに cron は便利ですが、タスクのまわし過ぎによるサービスのパフォーマンス低下や実行順序の制御を別途行う必要があります。自分は、そのためのツールとして、daemontoolssetlock コマンドがお気に入りです。setlock は、flock を用いて、タスクの待機や実行中止を制御することのできる、とても小回りのきくプログラムです。

1-59/* * * * * /usr/local/bin/setlock -nx /tmp/precompute.lock /usr/local/bin/setlock /tmp/allcron.lock precompute --mode=minutely
0 1-23/* * * *      /usr/local/bin/setlock /tmp/precompute.lock /usr/local/bin/setlock /tmp/allcron.lock precompute --mode=hourly
0 0 * * *      /usr/local/bin/setlock /tmp/precompute.lock /usr/local/bin/setlock /tmp/allcron.lock precompute --mode=daily && /usr/local/bin/setlock /tmp/allcron.lock rebuild_db

 たとえば、上の cron は、以下のようなことを実現しています。

  • 毎分1回、前回の処理が完了している場合のみ、毎分行うべき事前計算処理 (precompute --mode=minutely) を行う
  • 毎時1回、毎時必ず行うべき事前計算処理 (precompute --mode=hourly) を行う
  • 毎日1回、毎日必ず行うべき事前計算処理 (precompute --mode=daily) を行う
  • 毎日1回、日次の事前計算処理の完了後に、データベースの再構築 (rebuild_db) を行う
  • これらのタスクは、すべて順列化されて実行され、同時に複数が動作することはない

 最近はマルチコア環境が一般化しつつあるので、処理が CPU インテンシブな場合は、このようにして特定のCPUコアをバックグラウンドタスクに張り付けるというアプローチも可能です。また、HDD やメモリのバンド幅が問題になる場合は、それぞれのタスク内で sleep させることで、負荷の調節が可能です。DBIx::Replicate には、そのような仕組み (load アトリビュート) が入っています。

投稿者 kazuho : 2008年01月30日 11:08 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

トラックバック

このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/1749