更新 (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クライアントはそれを使用しませんか? 右?
どんな助けでも大歓迎です、乾杯