web-dev-qa-db-ja.com

SMTP電子メールボリューム

私の会社のアプリケーションには、顧客がオプトインに基づいてメールを送信するために使用する、すべてカスタムメイドのバルクメールシステムがあります。いくつかの特に大きな電子メールバッチ送信中にパフォーマンスモニタリングを行っているときに、現在の送信メカニズム(phpMailer)に起因する人為的な障壁があるように見えることに気づきました。彼らは私たちよりも速く送信していないことに気付きました。送信責任が戻ってきたので、今後の多数の大規模なクライアントを見越して徹底的にテストしています。

メーラープロトコルの送信レートを改善すると仮定すると(SwiftMailerへの変更を検討しています)、SMTPサーバーも最終的にボトルネックになるかどうかを検討していました。 SMTPサーバーからどのような種類のスループットを達成できますか? SMTPの送信(認証、パッケージングなど)に関する考慮事項は、パフォーマンスを調整する際に再検討する必要がありますか?

5
bpeterson76

ノンブロッキングSMTPサーバーを使用している限り(不正なDNS/SMTPサーバーにヒットした場合)、メールの宛先となるドメインの数と帯域幅はどれくらいか(大まかに言えば、ルールの例外が極端に表示されます)。外部サーバーでも同様の結果が表示されるため、後者(帯域幅)が疑われます。

最新のハードウェアでのパッケージ化/暗号化は、遅いサーバーに電子メールを送信するのに必要な時間のほんの一部です。独自のDNSサーバーをホストしている場合は、受信SMTPサーバーがレコードを再確認する可能性があるため、これらが高速な結果を返すことを確認してください(さらに遅くなります)。 (十分な帯域幅を備えた)2つのメールサーバーを持つことは、通常、より良い仕様の単一サーバーに同じ金額を費やすよりもはるかに高速です(遅い受信サーバーでのブロックのため)。

クイックウィンのための厄介なハック

  1. ドメイン名でメールアドレスを並べ替えます。電子メールアドレスを格納するテーブルにぶら下がっている新しいデータベーステーブルを作成する場合、外部キー、ユーザー部分、およびドメイン部分を含めることができます。レコードを更新するために、既存のデータとCRUDのいくつかの変更を分割して実行すると、これが達成されます。ドメイン名でソートすることにより、送信サーバーがリモートメールサーバーへの接続を再利用できるようにします(SPAMがブロックされないように注意してください)。

  2. コードを変更するのが難しく、メールサーバーを変更したい場合は、関数を変更して参照を受け入れることができます(PHPで&を前に付けます)。x秒ごとに変更される$ _GLOBAL変数を使用できます非表示のPHPページを呼び出すスケジューラー。

  3. ローカルDNSキャッシュを使用して、必要なMXレコードをクエリしますbefore run(または、少なくとも並行して実行するスクリプトを開始します)。ほとんどのキャッシュは24時間レコードを保持します(通常は3600秒と書き込まれます)。初期接続遅延を約100ミリ秒短縮できます。複数のSMTPサーバーがあり、受信者に複数のMXレコードがある場合、結果をスプーフィングできます。したがって、最初の送信サーバーは以下を認識します。

    • MXレコード1優先度10
    • MXレコード2優先度20
    • MXレコード3優先度30
    • MXレコード4優先度40

    そして、あなたの2番目の送信サーバーが見る

    • MXレコード1優先度40
    • MXレコード2優先度10
    • MXレコード3優先度20
    • MXレコード4優先度30

    このようにすると、並列動作を増やすことができますが、ポイント1からのゲインは失われます。

パケットトレースを実行してボトルネックを特定できる場合、必要な迅速な勝利を見つけるのに役立ちます。

3
Metalshark

私がPHPを愛しているのと同じように、そこがシステムのボトルネックです。 PHPは、テキスト処理に関しては他の言語の効率性がありません。
https://stackoverflow.com/questions/603163/is-Perl-a-good-option-for-heavy-text-processing

電子メールの処理と送信には、Perlの方が適しています。数年前、パーソナライズされた電子メールをオプトインに送信する簡単なPerlプログラムを作成しました。 Perlを使用して電子メールを作成し、ローカルのSendmailプログラムに送信するだけで、6時間で約80,000の電子メールを送信できました。これは、2GBのRAMを備えたかなり標準的なVirtual Private Server上にありました。

ローカルのSendmailプロセスにジョブを送信していますか、それともPHPMailerはSMTPを使用していますか? PHPは電子メールを送信するためにネットワークソケットを開く必要がないため、ローカルのSendmailプログラムは高速になります。

したがって、要約すると次のようになります。

  1. PHPの代わりにPerlを使用します(Perlも嫌いですが、より良いテキスト処理ツールです)
  2. ジョブをローカルのSendmailプログラムに送信します(必要に応じて、外部SMTPサーバーにジョブを転送するように構成できます)。
  3. ローカルサーバーが過負荷になった場合は、外部SMTPサーバーを使用します。
3
Shane Stillwell