23

処理スクリプト用に Laravel でキューを設定しました。私はbeanstalkdとsupervisordを使用しています。さまざまなタイプの処理用に 6 つの異なるチューブがあります。

問題は、チューブごとに、artisan が常に毎秒ワーカーを生成していることです。ワーカー コードは 1 秒間スリープしているように見えますが、ワーカー スレッドは 7 ~ 15% の CPU を使用し、これに 6 チューブを掛けます...そして、チューブごとに複数のワーカーが必要です..CPU が使い果たされています。

1秒のスリープを10秒に変えてみました。これは役に立ちますが、ワーカーが復帰すると 10 秒ごとに大きな CPU スパイクが発生します。キューが完全に空であるため、現時点では何も処理していません。ワーカーが何かを探しているだけです。

また、ブラウザでページを更新したときのlaravelのCPU使用率を確認するためにテストしましたが、それは約10%でした。ワーカーは、起動するたびに laravel インスタンスをスピンアップします。

これを解決する方法はありませんか?仕事の準備ができているかどうかを聞くことができるようにするためだけに、より高価なサーバーに多額の資金を投入する必要がありますか?

編集:

解決策が見つかりました...職人のキュー:リスナーまたはキュー:ワークを使用しないことでしたキューコードを調べたところ、この問題を回避する方法はないようです。ワーカーがチェックするたびにlaravelをロードする必要がありますより多くの仕事のために。

代わりに、pheanstalk を使用して独自のリスナーを作成しました。私はまだlaravelを使用して物事をキューにプッシュしています。カスタムリスナーはキューデータを解析し、職人のコマンドを実行します。

現在、リスナーの CPU 使用率は %0 未満です。CPU が起動するのは、実際に実行する作業を見つけてコマンドをトリガーするときだけです。それで問題ありません。

4

3 に答える 3

14

高 CPU の問題は、ワーカーがキュー内のジョブをチェックするたびに完全なフレームワークをロードするために発生します。laravel 4.2 では、 を使用できますphp artisan queue:work --daemonwhileこれにより、フレームワークが 1 回読み込まれ、ループ内でジョブのチェック/処理が行われるため、CPU が呼吸しやすくなります。デーモン ワーカーの詳細については、公式ドキュメントhttp://laravel.com/docs/queues#daemon-queue-workerを参照してください。

ただし、この利点には欠点もあります。コードをデプロイするときは特別な注意が必要であり、データベース接続に注意する必要があります。通常、長時間実行されているデータベース接続は切断されます。

于 2014-08-26T06:45:16.567 に答える
5

同じ問題がありました。

しかし、私は別の解決策を見つけました。職人はそのまま使いましたが、「見る」時間を修正しました。デフォルトでは (laravel から) 今回は 0 にハードコーディングされています。この値を 600 (秒) に変更しました。ファイル「vendor/laravel/framework/src/Illuminate/Queue/BeanstalkdQueue.php」および関数「public function pop($queue = null)」を参照してください。

ということで、作品も10分間待ち行列を聞いています。ジョブがない場合は終了し、スーパバイザが再起動します。ジョブを受信すると、ジョブが存在した後に実行し、スーパバイザが再起動しています。

==>もうポーリングはありません!

ノート:

  • iron.io キューやその他のキューでは機能しません。
  • 1 人のワーカーが複数のキューからジョブを受け入れるようにしたい場合は、うまくいかないかもしれません。
于 2013-06-18T20:10:14.950 に答える