2013-10-30 20 views
5

Tôi gửi bản tin hàng ngày cho khoảng 20 nghìn người nhận. Sau khi chuyển sang máy chủ khác, tôi cần khoảng sáu lần thời gian để sử dụng cùng một tập lệnh PHP - Tôi đã thử nhiều cài đặt khác nhau nhưng không có may mắn với nó (please see this post). Máy chủ email có vẻ được cấu hình đúng (liên quan đến spam, relay và virus), máy chủ chạy với Plesk 11.5.30.Gửi bản tin bằng cách sử dụng PHP SwiftMailer và SMTP

Làm nhiều thí nghiệm, thay đổi kịch bản PHP và các thiết lập Postfix tôi đã có thể đạt được hiệu quả tốt nhất như sau:

  1. Gửi email từ PHP sử dụng SwiftMailer.
  2. Sử dụng SMTP (tài khoản cục bộ) làm phương tiện giao thông.
  3. Chia danh sách người nhận thành bốn phần và bắt đầu quá trình PHP-CLI riêng biệt cho từng phần.

Khi tôi bắt đầu chỉ có một quy trình, PHP gửi khoảng 5 email/giây (giống như khi tôi gửi email bằng chức năng mail()). Postfix không có vấn đề gì với việc gửi chúng "trên đường bay", vì vậy không có hàng đợi nào cả.

Khi tôi bắt đầu bốn tiến trình, PHP gửi khoảng 10 email/giây, tuy nhiên postfix không thể gửi chúng được nữa “(Nó có thể gửi chỉ khoảng 5 email/giây) để hàng đợi trở nên lớn hơn và lớn hơn. Khi quá trình PHP kết thúc, tôi có khoảng 4500 email trong hàng đợi của tôi. Và đây là phần thú vị: khi không có PHP hoạt động nhiều hơn quy trình gửi email, Postfix „tăng tốc" để gửi khoảng 20 email/giây. Postfix có thể gửi email với tốc độ này trong khi PHP đang gửi email mới không? Sẽ không có hàng đợi và nó sẽ giải quyết được sự cố của tôi. Tôi sẽ đánh giá cao bất kỳ ý tưởng nào tôi có thể làm để cải thiện hiệu suất của tập lệnh của mình và máy chủ gửi bản tin.

Ở đây có cấu hình 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

Nếu Postfix trở nên nhanh hơn khi quá trình PHP của bạn kết thúc, có thể bạn gặp sự cố CPU? 'Top' nói gì khi các tiến trình PHP đang chạy? Bạn đang sử dụng máy chủ chia sẻ hoặc VPS? Spec gì? – halfer

+0

Chúng tôi sử dụng một máy chủ chuyên dụng mà thực sự không có nhiều việc phải làm. CPU và bộ nhớ không phải là vấn đề - chúng tôi có đủ tài nguyên (tôi đã kiểm tra lại lần này hôm nay trong khi chúng tôi gửi bản tin của chúng tôi). Chạy iostat -m -x -d 5 Tôi thấy có sử dụng đĩa rất cao (% util lên đến 100% - khi PHP và Postfix được thực hiện nó là khoảng 10% - điều này có liên quan gì đến vấn đề hiệu năng của chúng ta không?) Tôi không undrestand là, tại sao PHP trên máy chủ mới có thể gửi trong một quá trình tối đa 5-7 thư/giây (nếu bạn chỉ chạy một quá trình), trong khi máy chủ cũ của chúng tôi đã có thể gửi 20 và nhiều hơn nữa mỗi giây. – Okizb

+0

Tôi không phải là một chuyên gia về các vấn đề máy chủ, nhưng 100% của bất cứ điều gì sẽ có giá trị điều tra thêm, chắc chắn. Liệu nó có nói PHP và Postfix nào chịu trách nhiệm về mức sử dụng đó không? – halfer

Trả lời

0

Cảm ơn tất cả các câu trả lời và nỗ lực của bạn. Fortunatelly Tôi đã có thể tìm ra nguyên nhân chính của vấn đề - nó đã tiết kiệm hàng đợi trên đĩa cứng. Chúng tôi đã thay đổi nó thành RAM và hiện có thể gửi khoảng 30 email mỗi giây.

0

Hey Tôi không thể tìm ra vấn đề chính xác với các thiết lập của bạn nhưng tôi đã đọc những ý kiến ​​mà có thể giúp đỡ để tìm ra thời gian trễ chính xác. Vui lòng tham khảo http://ubuntuforums.org/showthread.php?t=2007309 và bạn cũng có thể kiểm tra lại mã của bạn bằng http://liangsun.org/posts/configure-mail-service-with-php-mail-function-and-postfix/

Và đối với thiết lập của swiftmailer tham khảo https://bbs.archlinux.org/viewtopic.php?id=82062

2

Vì bạn viết về quá trình PHP của bạn đang gửi khoảng 5 hoặc 20 mail mỗi giây, tôi sẽ giả sử bạn đã đo lường chi tiết mã PHP của bạn, vì vậy nếu sự chậm trễ này nằm trong mã PHP, bạn nên được phát hiện.

Đọc nhận xét Tôi cũng giả sử hệ thống của bạn khá lớn, vì vậy bạn có đủ ram và đĩa. Theo kinh nghiệm của tôi, một vấn đề rất phổ biến có thể gây ra sự chậm trễ như vậy là độ phân giải DNS, tốt, có nghĩa là cấu hình DNS sai, dẫn đến sự chậm trễ xung quanh. Nhưng giả thuyết này là tất cả để được chứng minh.

Mặt khác, tôi thậm chí còn nhớ rằng postfix có cấu hình điều chỉnh để tránh lạm dụng máy chủ. http://www.postfix.org/TUNING_README.html

Cuối cùng, nếu bạn không tìm thấy bất cứ điều gì trong cấu hình postfix, những gì tôi có thể đề nghị bạn là cố gắng gỡ lỗi quá trình postfix trong quá trình thực hiện, với strace tiện ích.

Đây là một tiện ích khá hữu ích, tôi thường sử dụng nó khi tôi phải gỡ lỗi các vấn đề không phổ biến. Tóm lại: strace liệt kê tất cả các cuộc gọi hệ thống được thực hiện bởi quy trình. Có rất nhiều tùy chọn có sẵn trong strace, nhưng tôi thường chỉ sử dụng:

strace -fp <pid of main process> 

Trong khi gỡ lỗi, bạn sẽ thấy tất cả các cuộc gọi hệ thống được thực hiện bởi quá trình chính postfix và tất cả các con của nó. Nếu bạn thêm tùy chọn -c thì bạn sẽ thấy thời gian dành cho mọi cuộc gọi hệ thống.

Các vấn đề liên quan