92

CELERYD_PREFETCH_MULTIPLIER構成オプション(docs )について知りました。デフォルトは 4 ですが、(私が思うに) プリフェッチをオフにするか、できるだけ低くしたいと考えています。今は 1 に設定しました。これは探しているものに十分近いですが、まだ理解できないことがいくつかあります。

  1. このプリフェッチが良いアイデアである理由は何ですか? メッセージキューとワーカーの間に多くの待ち時間がない限り、その理由はわかりません (私の場合、それらは現在同じホストで実行されており、最悪の場合、同じデータ内の別のホストで実行される可能性があります)中心)。ドキュメントには欠点のみが記載されており、利点が何であるかは説明されていません。

  2. 多くの人は、この方法でプリフェッチをオフにできることを期待して、これを 0 に設定しているようです (私の意見では妥当な仮定です)。ただし、0 は無制限のプリフェッチを意味します。そもそもタスクキューを導入した同時実行性/非同期性が完全に排除されないのではないでしょうか?

  3. プリフェッチをオフにできないのはなぜですか? ほとんどの場合、これをオフにすることはパフォーマンスにとって良い考えではないかもしれませんが、これが不可能な技術的な理由はありますか? それとも実装されていないだけですか?

  4. 場合によっては、このオプションは に接続されCELERY_ACKS_LATEます。例えば。Roger Hu は次のように書いています«[…] 多くの場合、[ユーザー] が本当に望んでいるのは、子プロセスと同じ数のタスクだけをワーカーに予約させることです。しかし、これは遅延確認を有効にしないと不可能です […]» これら 2 つのオプションがどのように接続されているのか、なぜ一方が他方なしでは不可能なのかがわかりません。接続の別の言及はここにあります。2 つのオプションが関連付けられている理由を誰か説明できますか?

4

5 に答える 5

20

警告: redis ブローカー + Celery 3.1.15 でのテストの時点で、CELERYD_PREFETCH_MULTIPLIER = 1プリフェッチの無効化に関して私が読んだすべてのアドバイスは明らかに誤りです。

これを実証するには:

  1. 設定CELERYD_PREFETCH_MULTIPLIER = 1
  2. それぞれ数秒かかる 5 つのタスクをキューに入れます (例: time.sleep(5))
  3. Redis でタスク キューの長さの監視を開始します。watch redis-cli -c llen default

  4. 始めるcelery worker -c 1

  5. Redis のキューの長さがすぐに から5に低下することに注意してください。3

CELERYD_PREFETCH_MULTIPLIER = 1 はプリフェッチを妨げません。プリフェッチをキューごとに 1 つのタスクに制限するだけです。

-Ofair、ドキュメントに記載されていることにもかかわらず、プリフェッチも防止しません

ソース コードを変更する以外に、プリフェッチを完全に無効にする方法は見つかりませんでした。

于 2015-10-26T23:07:59.913 に答える