2011-12-15 16 views
2

私は、Amazon EC2 'Large'インスタンス、つまりPHP5とMySQLを使用したUbuntu Natty x64を実行しています。我々はCRONを介してPHPスクリプトを実行します - これはSMTP/PHPMailerを使用して電子メールリスト(2000-4000電子メール)を送信します。PHP CRON電子メールをCPUに送信

サーバーの動作が非常に遅い(これらのCRONジョブのいくつかはパラレルに実行されます)、CPUが100%になります。メモリ使用量は低く(約600MB/8GBしか使用されない)、各CRONジョブはCPU%のかなりの部分を占有します。たとえば、それぞれ20〜30%、4-5台が並行して実行されます。

問題を特定しようとすると、MySQLで低速のクエリログが実行されましたが、私の注意を引いたものはありませんでした。このCPU使用率の原因を絞り込むにはどうすればよいですか? SMTP /電子メールはCPUを集中的に使用しているのでしょうか、それともプログラミングやサーバーの問題があることを示す記号ですか?ありがとう!

enter image description here

EDIT:問題が解決されます。電子メールが「成長」する(以前の電子メールコンテンツの一部が次の電子メールに注入されていた)些細な(もちろん)バグがあったため、電子メールの前処理は各加入者にとってますますばかげてしまった。結果として得られた電子メールには数百/数千のトラッキングイメージがあり、開いたときにすべてが同時にサーバーに当たった。つまり、イメージをgmailに表示する。自爆したDDoS攻撃と2日間の眠りを止めた後、私は人生で様々な選択肢を考えながらモーガンキャプテンのボトルを楽しむつもりです。

+0

PHPスクリプトはループで連続して実行され、4000個の電子メールを送信しますか、または繰り返し停止して再起動しますか?コマンドラインスクリプトとしてPHPファイルを繰り返しトリガすると、CPUを集中的に使用してオペコードを生成することがあります。 – DhruvPathak

+0

各CRONジョブは1分に1回実行されますが、「1つの」リスト(4Kメール)を送信してから停止します。このリストの実行中、PHPスクリプトは4000個の電子メールをループし、いくつかの情報を設定し、各電子メールを個別に送信するSMTP接続を行います。 – Harper

+0

最初にやるべきことは、電子メールを実際にキューに入れた行をコメントアウトしてから、プロセス全体を再度実行して何が起こるかを確認することです。つまり、すべてのコードを実行してメッセージコンテンツを生成しますが、実際にはメッセージを送信しません。これは、それが世代であるか、問題を引き起こしている送信であるかを少なくとも伝えます。 –

答えて

1

物事:SMTPサーバとの

  1. 非ブロックIO。

  2. 長い文字列操作を伴うPHPで使用されるSMTPライブラリの実装/すべてのループで長いファイルがエンコードされる(覚えておいてください:プロトコルはフォーマットされていなければならず、sendメソッドを他の多くの方法で呼び出すたびにチェック/ 。

  3. メールごとに1つ(またはそれ以上)のクエリ。

ループ内で実行される各操作に費やされた時間を測定してみてください。

単純な$start = microtime (true)printf (___FILE__.':'.__LINE__.": here after % 0.8f seconds\n", microtime(true) - $start);をデバッグファイルまたは別のプロファイリングツールに使用できます。

プロトコルのフォーマット/エンコード時間を短縮してください。

以上のマシンのコアの数同時に実行されているPHPスクリプトのインスタンス。

1

まず、どのプログラムが100%CPUを使用しているかを正確に確認します。

PHPインタープリタの場合、コードに何か問題があります.SMTPクライアントは、SMTPサーバーによるスループットに多くの時間がかかるため、100%の使用率に達することは絶対にありません。この(非網羅的なリスト)を引き起こす可能性があります

+0

あなたは私により多くの情報を与えることができますか?それが通訳者かどうかはどのようにして知ることができますか?私はLinux上でhtopコマンドを実行し、CRONジョブは#1〜#4と表示されます。ところで私はPHP-APCを実行しています(これはコマンドライン/ CRONかApacheのみに影響しますか?) – Harper

+0

@Harperはあなたの質問のトップの出力を示します。 – Alnitak

+0

は私の質問をスクリーンショットで更新しました – Harper

1

これはphpに限定されないかもしれません...あなたはローカルボックスに接続しているSMTPサーバですか?ソケットがなくなっていますか?要求は自分自身をブロックしていますか?

通常、何をしているかのように、キューベースのアプローチが最適です。

メールを送信するためにサードパーティのサービスを使用したことはありますか?API HTTPリクエストを送信するだけですが、これにはいくつかの利点があります。これらのサービスのほとんどは、メールサーバーとの関係を設定してメールが実際に受信トレイに届き、SMTPサーバーがスパムとしてブラックリストに登録されません。 Amazonはこれを行うことができるサービスを持っているので、Postmarkのような他の人をしてください。

関連する問題