9

topユーティリティプロセスでわかるようにcelery、多くの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_multiceleryd_multiだから私の質問は、プロファイリングを有効にしてセロリを開始するようにどのように伝えることができますか?私の場合、これはに-m cProfile -o out.profオプションを追加することを意味しますpython

どんな助けでも大歓迎です。

4

1 に答える 1

17

あなたは2つの別々の問題を混同していると思います。処理している個々のタスクが多すぎるか、個々のタスクが非効率的である可能性があります。

これらのどれが問題であるかを知っているかもしれませんが、それがどれであるかはあなたの質問からは明らかではありません。

処理されているタスクの数を追跡するには、celerymonを確認することをお勧めします。特定のタスクが予想よりも頻繁に表示される場合は、そのタスクがどこから呼び出されているかを調査できます。

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

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

最後に、タスクごとのプロファイリングとは、サーバー上のinitスクリプトを変更する必要がなく、プロジェクトコードの設定を使用して、グローバルまたはタスクごとにプロファイリングをオンまたはオフにすることもできることを意味します。

于 2011-09-19T16:04:26.663 に答える