5

私は毎日、約 2 万人の受信者にニュースレターを送信しています。他のサーバーに移動した後、同じ PHP スクリプトを使用してこれを行うには、約 6 倍の時間が必要です。さまざまな設定を試しましたが、うまくいきませんでした (この投稿を参照してください)。電子メール サーバーは (スパム、リレー、ウイルスに関して) 適切に構成されているようで、サーバーは Plesk 11.5.30 で実行されます。

多くの実験を行い、PHP スクリプトと Postfix 設定を変更して、次の方法で最高のパフォーマンスを達成することができました。

  1. SwiftMailer を使用して PHP からメールを送信します。
  2. トランスポートとして SMTP (ローカル アカウント) を使用します。
  3. 受信者リストを 4 つの部分に分割し、それぞれに対して個別の PHP-CLI プロセスを開始します。

1 つのプロセスのみを開始すると、PHP は 1 秒あたり約 5 通のメールを送信します (これは、mail() 関数を使用してメールを送信する場合とほぼ同じです)。Postfix はそれらを「オンザフライ」で送信することに問題がないため、キューはほとんどありません。

4 つのプロセスを開始すると、PHP は毎秒約 10 通のメールを送信しますが、postfix はそれらを「オンザフライ」で送信できなくなり (毎秒約 5 通のメールしか送信できません)、キューがどんどん大きくなります。PHP プロセスが終了すると、約 4500 通のメールがキューに入っています。ここで興味深い点があります。電子メールを送信するアクティブな PHP プロセスがなくなると、Postfix は「加速」して、毎秒約 20 通の電子メールを送信します。PHP が新しい電子メールを配信している間、Postfix はこのレートで電子メールを送信できますか? キューがなくなり、問題が解決します。

ニュースレターを送信するスクリプトとサーバーのパフォーマンスを向上させるために何ができるかを考えていただければ幸いです。

Postfix の設定は次のとおりです。

root@hostname:~# postconf -n 
alias_database = hash:/etc/aliases 
alias_maps = hash:/etc/aliases, hash:/var/spool/postfix/plesk/aliases 
append_dot_mydomain = no 
biff = no 
config_directory = /etc/postfix 
disable_vrfy_command = yes 
inet_interfaces = all 
inet_protocols = ipv4 
mailbox_size_limit = 0 
mailman_destination_recipient_limit = 1 
message_size_limit = 51200000 
mydestination = (none), localhost, localhost.localdomain, localhost 
mydomain = domain.com 
myhostname = myhostname.com 
mynetworks = 127.0.0.0/8 [::1]/128 my.ip.add.ress 
plesk_virtual_destination_recipient_limit = 1 
readme_directory = no 
recipient_delimiter = + 
relayhost = 
sender_dependent_default_transport_maps = hash:/var/spool/postfix/plesk/sdd_transport_maps 
smtp_connect_timeout = 10s 
smtp_helo_timeout = 100s 
smtp_send_xforward_command = yes 
smtp_tls_security_level = may 
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache 
smtp_use_tls = no 
smtpd_authorized_xforward_hosts = 127.0.0.0/8 [::1]/128 
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU) 
smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_rbl_client zen.spamhaus.org 
smtpd_proxy_timeout = 3600s 
smtpd_recipient_restrictions = permit_mynetworks, check_client_access pcre:/var/spool/postfix/plesk/no_relay.re, permit_sasl_authenticated, reject_unauth_destination 
smtpd_sasl_auth_enable = yes 
smtpd_sender_restrictions = check_sender_access hash:/var/spool/postfix/plesk/blacklists, permit_sasl_authenticated, check_client_access pcre:/var/spool/postfix/plesk/non_auth.re 
smtpd_timeout = 3600s 
smtpd_tls_cert_file = /etc/postfix/postfix_default.pem 
smtpd_tls_key_file = $smtpd_tls_cert_file 
smtpd_tls_security_level = may 
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache 
smtpd_use_tls = yes 
transport_maps = , hash:/var/spool/postfix/plesk/transport 
virtual_alias_maps = $virtual_maps, hash:/var/spool/postfix/plesk/virtual 
virtual_gid_maps = static:31 
virtual_mailbox_base = /var/qmail/mailnames 
virtual_mailbox_domains = $virtual_mailbox_maps, hash:/var/spool/postfix/plesk/virtual_domains 
virtual_mailbox_limit = 0 
virtual_mailbox_maps = , hash:/var/spool/postfix/plesk/vmailbox 
virtual_transport = plesk_virtual 
virtual_uid_maps = static:110
4

3 に答える 3

2

PHP プロセスが 1 秒あたり約 5 通または 20 通のメールを送信していると書いているので、すでに PHP コードを詳細に測定していると思います。したがって、この遅延が PHP コードにある場合は、すでに発見されているはずです。

コメントを読むと、あなたのシステムはかなり大きいので、十分な RAM とディスクがあると思います。

私の経験では、このような種類の遅延を引き起こす可能性のある非常に一般的な問題は、DNS 解決です。つまり、DNS の構成が間違っているため、全体的に遅延が発生します。しかし、この仮説はすべて証明されなければなりません。

一方で、サーバーの悪用を避けるために、postfix にはスロットリング構成があることさえ覚えています。http://www.postfix.org/TUNING_README.html

最後に、postfix 構成に何も見つからない場合は、ユーティリティ strace を使用して、実行中に postfix プロセスをデバッグすることをお勧めします。

これは非常に便利なユーティリティです。一般的ではない問題をデバッグする必要がある場合によく使用しました。つまり、 strace は、プロセスによって実行されたすべてのシステム コールを一覧表示します。strace には多くのオプションが用意されていますが、私は通常次のものだけを使用します。

strace -fp <pid of main process>

デバッグ中に、postfix メイン プロセスとそのすべての子プロセスによって実行されたすべてのシステム コールが表示されます。-c オプションを追加すると、すべてのシステム コールに費やされた時間が表示されます。

于 2013-11-11T00:32:01.973 に答える
0

設定の正確な問題を見つけることができませんが、正確なタイムラグを見つけるのに役立つコメントを読みました. http://ubuntuforums.org/showthread.php?t=2007309を参照してください。また、 http://liangsun.org/posts/configure-mail-service-with-php-mail-function-andでコードを再確認できます。-後置/

また、swiftmailer の設定については、https: //bbs.archlinux.org/viewtopic.php?id=82062 を参照してください。

于 2013-11-08T12:36:51.910 に答える