2011-09-19 3 views
5

topユーティリティで見ることができるように、celery processcessは多くのCPU時間を消費します。だから私はそれをプロファイルしたい。セロリタスクプロファイリング

私はそうのような開発者のマシン上で手動で行うことができます。

python -m cProfile -o test-`date +%Y-%m-%d-%T`.prof ./manage.py celeryd -B 

しかし、私は本番マシン上でそれをプロファイルする必要があり、正確なタイミングを持っています。そのマシン(Fedora 14)では、initスクリプトによってセロリが起動されます。例えば。

service celeryd start 

私は、これらのスクリプトは、最終的には最終的にmanage.py celeryd_multiを呼び出す考え出しました。だから私の質問は、celeryd_multiにプロファイリングを有効にしてセロリを開始するように指示する方法は?私の場合は、-m cProfile -o out.profオプションをpythonに追加することを意味します。

ご迷惑をおかけして申し訳ありません。

答えて

12

あなたは2つの別々の問題を混乱させると思います。あまりにも多くの個々のタスクを処理している場合や、個々のタスクが非効率的である可能性があります。

これらのうちどれが問題であるかわかりますが、それはあなたの質問から明らかではありません。

処理されているタスクの数を追跡するには、celerymonを見ることをお勧めします。特定のタスクが頻繁に出現した場合は、それが期待されるタスクがどこから呼び出されているかを調べることができます。

セロリ全体のプロファイリングは、制御できないコードがたくさんあるので、おそらく役に立ちません。あなたが言うように、それはあなたが生産でそれを実行する上で問題があることを意味します。 profiling codeをタスク定義に直接追加することをお勧めします。

cProfile.run('func()')は、セラムとコードの間接的なレイヤーとして使用でき、タスクの実行ごとにプロファイルが作成されます。一意のファイル名を生成してrunに2番目のパラメータとして渡すと、タスクごとに検査できるプロファイルデータで構成されたディレクトリがあります。pstats.addを使用すると、複数のタスク実行をまとめて組み合わせることができます。

最後に、タスクごとのプロファイリングとは、サーバー上のinitスクリプトを変更する必要がなく、プロジェクトコードの設定をグローバルまたはタスクのいずれかでオンまたはオフに切り替えることもできます。

+0

「celerymon」は現在維持されていません。 – harukaeru