2013-10-30 59 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选项,那么您会看到每次系统调用花费的时间。