2013-10-30 93 views
5

我每天發送一份簡報給大約20K個收件人。移動到其他服務器後,我需要使用相同的PHP腳本多六倍的時間 - 我嘗試了許多不同的設置,但沒有運氣(please see this post)。電子郵件服務器似乎已經正確配置(關於垃圾郵件,中繼和病毒),服務器將在Plesk 11.5.30中運行。使用PHP SwiftMailer和SMTP發送簡報

做大量的實驗,改變PHP腳本和Postfix的設置,我能夠實現與下面的最佳性能:從PHP使用SwiftMailer

  1. 發送電子郵件。
  2. 使用SMTP(本地帳戶)作爲傳輸。
  3. 將收件人列表分爲四部分,併爲每個部分啓動單獨的PHP-CLI過程。

當我只啓動一個進程時,PHP發送大約5封電子郵件/秒(與使用mail()函數發送電子郵件時大致相同)。 Postfix在「即時」發送時沒有任何問題,所以沒有任何隊列。

當我開始四個進程時,PHP發送大約10封電子郵件/秒,但是postfix無法發送「on the fly 「(它每秒只能發送大約5封電子郵件),所以隊列變得越來越大,當PHP進程結束時,我的隊列中有大約4500封電子郵件,這裏有一個有趣的部分:當沒有更多的活動PHP進程發送電子郵件,Postfix「加速」發送大約20封電子郵件/秒。Postfix能夠以這種速度發送電子郵件,而PHP正在發送新的電子郵件嗎?將不會有隊列,它會解決我的問題。我希望我能做些什麼來改進腳本的性能和服務器發送通訊。

這裏談到的Postfix配置:

[email protected]:~# 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 
+0

如果你的PHP進程完成後Postfix變快了,也許你有CPU問題?當PHP進程正在運行時,「top」是什麼意思?你在共享服務器上還是VPS?什麼規格? – halfer

+0

我們使用專門的服務器,實際上並沒有太多的事情要做。 CPU和內存不是問題 - 我們有足夠的資源(當我們發送新聞時,我再次檢查了這一點)。運行iostat -m -x -d 5我發現磁盤使用量非常高(%util高達100% - 當PHP和Postfix完成時,它大約有10% - 這可能與我們的性能問題有關嗎?)爲什麼新服務器上的PHP能夠以最大5-7個郵件/秒發送一個進程(如果只運行一個進程),而我們的舊服務器能夠每秒發送20個或更多進程,爲什麼呢? – Okizb

+0

我不是服務器問題的專家,但是當然,100%的任何事情都值得進一步調查。它是否說明PHP和Postfix中的哪一個對這種使用級別負責? – halfer

回答

0

謝謝你的所有答案和你的努力。幸運的是,我能夠找到問題的主要原因 - 這是將隊列保存在硬盤上。我們將其更改爲RAM,現在每秒能發送約30封電子郵件。

2

既然你寫你的PHP過程中每秒發送約5或20的郵件,我會想你重新檢查你的代碼已經在詳細測量你的PHP代碼,所以如果這個延遲是在PHP代碼中,你應該已經發現了。

閱讀評論我還假設你的系統很大,所以你有足夠的內存和磁盤。

根據我的經驗,可能會導致此類延遲的一個非常常見的問題是DNS解決方案,我的意思是DNS的配置錯誤,導致全面延遲。但是這個假設是所有的證明。

另一方面,我甚至記得postfix有一個限制配置,以避免服務器濫用。 http://www.postfix.org/TUNING_README.html

最後,如果在postfix配置中找不到任何東西,我可以建議您嘗試在執行過程中使用實用程序strace調試postfix進程。

這是一個非常有用的工具,我經常在調試非常見問題時使用它。簡而言之:strace列出了進程完成的所有系統調用。有很多在strace的可用選項,但我通常只使用:你會看到所有後綴主進程執行系統調用及其所有子

strace -fp <pid of main process> 

在調試。如果您添加-c選項,那麼您會看到每次系統調用花費的時間。