0

更新 (2013 年 10 月 1 日):

今日、私はついに問題が何であるかを知りました。xdebug を使用して何時間もデバッグし、複数のスクリプトを実行しようとした後、スクリプトの本体に問題がないことに気付きました。10 ~ 20 秒のスリープ状態でテスト ワーカーを実行すると、ほとんどの時間 CPU がアイドル状態であったため、Symfony をブートストラップするために CPU のほとんどを消費していると推測されました。

私のスクリプトは非常に迅速に実行され、新しいスクリプトなどにポーンするために強制do{}while()終了されました。ランダムな秒数後に終了する を追加して修正しました (すべてのワーカーが同時に再起動するのを避けるため)。

負荷を平均 35 ~ 45% から平均 0.5 ~ 1.5% に減らしました。これは大きな改善です。再開するには Symfony は一度ブートストラップされ、その後、スクリプトはランダムなタイムアウトまで待って、それ自体を強制終了し、それ自体の新しいインスタンスを起動します。これは、スクリプトのハングやデータベース接続のタイムアウトなどを回避するためです。

より良い解決策がある場合は、遠慮なく共有してください。同じ量の作業で100% の CPU 使用率 (自動スケーリングにより x4 サーバー) から 1% 未満 (そしてサーバーは 1 つだけ) になったことをとてもうれしく思います。さらに高速になりました。


更新 (2013 年 9 月 24 日):

Symfony のコンソール コンポーネントがdevデフォルトで環境を使用していることに気付きました。prodコマンド ラインで次のように指定しました./app/console --env=prod my:command:action。実行時間を 5 で割ります。これはかなり良い値です。

また、CPUを大量に消費しているような気がしcurl_execますが、よくわかりません。

xdebug を使用して CPU 使用率をデバッグし、生成された cachegrind を読み取ろうとしていますが、関数、クラスごとに使用される CPU サイクルの参照はありません。費やされた時間と使用されたメモリのみです。

PHP コマンド ラインで xdebug を使用する場合#!/usr/bin/env php -d xdebug.profiler_enable=Onは、スクリプトの先頭で使用します。

誰かが xdebug でこれをデバッグするためのヒントを持っているなら、私はそれを聞いてうれしいです;)


私は本当の希望なしにこの質問をしています。

ワーカーを実行していくつかのバックグラウンド タスクを処理するために使用するサーバーがあります。このサーバーは、CPU 使用率が高いアラートが設定された Auto Scaling グループ内の EC2 サーバー (m1.small) です。

ジョブが処理されるのを待っているワーカー (php スクリプト インスタンス) が 20 ほどあります。スクリプトを実行するために、のコンソール コンポーネントを使用していますSymfony 2.3 framework

このジョブでは、URL からデータをフェッチし、結果をループして、MySQL (RDS サーバー) に行ごとに (ジョブごとに最大 1000 行) 挿入することはあまりありません。

問題は、1 つまたは 2 つのワーカーが実行されていると、CPU が 100% になり (常に 100% になるとは思いませんが、1 秒ごとに急上昇している)、自動スケーリング グループが新しいインスタンスを起動することです。 .

まったく正当化されていないCPU使用率を減らしたいです。php-fpm (fastCGI) を見ていましたが、Web サーバー専用のようです。PHPクライアントはそれを使用しませんか? 右?

どんな助けでも大歓迎です、乾杯

4

1 に答える 1