Benchmark entre Servidores de Emails
por
em 26-05-2015 às 21:44 (3086 Visualizações)
Sou o desenvolvedor do projeto MTA Selor. Há muito tempo me perguntam sobre o desempenho do projeto e resolvi criar este teste de comparação.
O teste foi feito entre: Postfix, Exim e Selor.
Eu tentei não cometer qualquer injustiça com um ou outro MTA, tanto que vou apresentar quais ferramentas, critérios e arquivos de configurações usados, para qualquer um poder reproduzir os testes ou até mesmo conferir o que foi usado. Todos os arquivos de configurações usados estão no final deste documento
Qualquer um poder fazer os mesmos testes e comprovar os resultados.
Para o Postfix e o Exim, eu busquei no Google por técnicas de Tuning para deixa-los o mais rápido possível. Para o
Postfix eu segui os passos que encontrei principalmente no site do próprio projeto: http://www.postfix.org/TUNING_README.html
Para o Exim eu não achei praticamente nada e algumas coisas pedindo para mexer em parâmetros do Sistema Operacional e isso eu não fiz, já que os outros MTAs rodariam neste mesmo sistema.
Eu não usei máquina virtual para rodar o Linux com os MTAs simplesmente porque o S.O. hospedeiro atrapalha o desempenho dos testes e eles ficam totalmente inconstantes. Usei uma máquina dedicada.
Servidor que rodou os MTAs
Sistema Operacional Usado Linux Slackware 13.37.0 (64 Bits)
Processador
Intel Dual Core 3.00GHz
Memória RAM
2GB DDR3 1333Mhz - Kingston
Placa Mãe
ASUS P5G41T-M LX2/BR HD
Western Digital 80GB 7200-RPM SATA 3.0Gb/s
Placa de Rede
Realtek RTL8111/8168B, 1-GBit
Micro que enviou os emails
Sistema Operacional Usado Windows 7 (64 Bits)
Processador
Intel Core i5 – 1.80GHz
Memória RAM
4GB DDR3
Placa de Rede
Realtek PCIe FE Family Controller, 1-GBit
Embora as placas de rede de ambos os micros fossem de 1 GBit, foi usado um Switch de 100 Mbits.
O DNS do servidor foi apontado para ele mesmo ( localhost ) e usei o BIND/NAMED como serviço de DNS.
Usei como base de dados o MySQL 5.1.56 e alimentei a tabela de domínios, contas e aliases com diversos registros, para tentar criar um ambiente ‘real’.
O programa usado para envio das mensagens foi um gratuito que eu encontrei na Internet, da IceWarp: Server Tool 10.4.0 (2011-11-10).
Site da ‘fabricante’: http://www.icewarp.com
Link direto do programa: http://dl.icewarp.com/tools/srvtest.zip
Servidor POP3/IMAP usado:
Dovecot 2.2.12. Compilado com :
Obs: O Dovecot foi instalado apenas para que fosse possível usar seu MDA ( deliver )Código :./configure --with-mysql make
MTAs Usados:
Postfix 3.0.1. Compilado com:
Código :make -f Makefile.init makefiles \ 'CCARGS=-DHAS_MYSQL -I/usr/include/mysql' \ 'AUXLIBS=-L/usr/lib64/mysql -lmysqlclient -lz -lm'
Exim 4.85. Compilado com (Apenas as opções do MySQL foram ligadas no Makefile):
Código :make
Selor 1.4 Compilado com (O módulo MySQL usado foi o selor_mysql V 1.1):
Código :make linux
Modo de caixa postal usado: Maildir
TESTE 1
Envio de 1000 emails de 1Kb de tamanho sem o acionamento do MDA (deliver do Dovecot) com 10 conexões simultâneas.
Este teste permite analisarmos o desempenho de cada MTA sem a interferência do programa que entrega a mensagem na caixa postal Maildir. No caso, o deliver do Dovecot.
Observações para este teste:
Postfix: Eu desabilitei as opções mailbox_command, dovecot_destination_recipient_limit e virtual_transport do main.cf que é para fazer ele não tentar entregar a mensagem na caixa postal, não acionando o MDA.
Selor: Alterei a opção Immed_delivery do selor.conf para ter esse efeito.
Exim: Não encontrei uma forma dele não acionar o MDA, então, no transport ‘local_delivery’ eu apontei o ‘file’ para /dev/null para não gerar tanto I/O de Disco, embora mesmo assim ele já perca um pouco de CPU lendo o arquivo de email.
Neste teste foi medido:
- Tempo total gasto para o envio das 1000 mensagens (Quando menor, melhor)
- Load Average do servidor após o término do envio das 1000 mensagens (Quanto menor, melhor)
- Número de mensagens por segundo que o MTA conseguiu aceitar (Quanto maior, melhor)
Envio de 1000 emails de 1Kb de tamanho sem o acionamento do MDA (deliver do Dovecot) com 30 conexões simultâneas.
TESTE 2
Este teste permite analisarmos o desempenho de cada MTA sem a interferência do programa que entrega a mensagem na caixa postal Maildir. No caso, o deliver do Dovecot.
Observações para este teste:
Postfix: Eu desabilitei as opções mailbox_command, dovecot_destination_recipient_limit e virtual_transport do main.cf que é para fazer ele não tentar entregar a mensagem na caixa postal
Selor: Alterei a opção Immed_delivery do selor.conf para ter esse efeito.
Exim: Não encontrei uma forma dele não acionar o MDA, então, no transport ‘local_delivery’ eu apontei o ‘file’ para /dev/null para não gerar tanto I/O de Disco, embora mesmo assim ele já perca um pouco de CPU lendo o arquivo de email.
Neste teste foi medido:
- Tempo total gasto para o envio das 1000 mensagens (Quando menor, melhor)
- Load Average do servidor após o término do envio das 1000 mensagens (Quanto menor, melhor)
- Número de mensagens por segundo que o MTA conseguiu aceitar (Quanto maior, melhor)
TESTE 3
Envio de 1000 emails de 1Kb de tamanho com o acionamento do MDA (deliver do Dovecot) com 10 conexões simultâneas.
Este teste permite analisarmos o desempenho de cada MTA junto com o acionamento do MDA (deliver do dovecot).
Observações para este teste:
Postfix: Opções mailbox_command, dovecot_destination_recipient_limit e virtual_transport do main.cf foram ativadas e apontadas para o deliver do Dovecot
Selor: Opção Immed_delivery do selor.conf ativada.
Exim: Transport para mensagens locais foi apontada para o dovecot_delivery
Neste teste foi medido:
- Tempo total gasto para o envio das 1000 mensagens (Quando menor, melhor)
- Tempo total gasto para a finalização da fila (Quando menor, melhor)
- Load Average do servidor após o término do envio das 1000 mensagens (Quanto menor, melhor)
- Número de mensagens por segundo que o MTA conseguiu aceitar (Quanto maior, melhor)
TESTE 4Envio de 1 email de 48 Mb de tamanho
Este teste permite analisarmos a velocidade de recebimento de cada MTA
Neste teste foi medido:
- Tempo total gasto para a entrega do email (Quanto menor, melhor)
- Taxa de transferência (Quanto maior melhor)
Obs: O Load Average medido para todos os MTAs foi de 0.00.
Arquivos de configurações:
Postfix (main.cf)
Código :# -------- Global Configuration -------- queue_directory = /var/spool/postfix/ command_directory = /usr/sbin mail_owner = postfix default_privs=nobody default_transport=smtp alias_maps=hash:/etc/postfix/aliases alias_database=hash:/etc/postfix/aliases readme_directory = no sample_directory = /etc/postfix sendmail_path = /usr/sbin/sendmail setgid_group = postdrop manpage_directory = /usr/local/man newaliases_path = /usr/bin/newaliases mailq_path = /usr/bin/mailq smtpd_banner=$myhostname ESMTP MEU DOMINIO disable_vrfy_command=yes home_mailbox=Maildir/ mynetworks=127.0.0.0/8 10.0.0.0/8 message_size_limit = 52428800 default_process_limit = 500 initial_destination_concurrency = 5 default_destination_concurrency_limit = 30 smtpd_error_sleep_time = 0 smtpd_client_connection_count_limit = 500 # --- Global Domain --- myhostname=localhost mydomain=localhost myorigin= $mydomain #mydestination= $mydomain, $transport_maps mydestination= $mydomain # --- MYSQL --- virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_mailbox_domains.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf virtual_uid_maps = static:105 virtual_gid_maps = static:100 #transport_maps = mysql:/etc/postfix/mysql_transport_maps.cf # -- Quota #mailbox_size_limit = 51200000 #virtual_mailbox_base = /var/spool/mail #virtual_mailbox_limit_inbox = yes #virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf #virtual_mailbox_limit_override = yes #virtual_mailbox_lock = fcntl #virtual_maildir_extended = yes #virtual_create_maildirsize = yes #virtual_mailbox_limit = 100000000 #virtual_maildir_limit_message = Desculpe, o diretório de correio do usuário estourou sua quota, por favor tente novamente depois. #virtual_overquota_bounce = no # --- SASL --- #smtpd_sasl_auth_enable = yes #smtpd_sasl_security_options = noanonymous #broken_sasl_auth_clients = yes #smtpd_recipient_restrictions = # permit_sasl_authenticated, # permit_mynetworks, # check_relay_domains # --- MDA --- #unknown_local_recipient_reject_code = 550 #mailbox_command = /usr/local/libexec/dovecot/deliver #dovecot_destination_recipient_limit = 1 #virtual_transport = dovecot
Postfix (master.cf)
Código :smtp inet n - n - 300 smtpd pickup unix n - n 60 1 pickup cleanup unix n - n - 0 cleanup qmgr unix n - n 300 1 qmgr #qmgr unix n - n 300 1 oqmgr tlsmgr unix - - n 1000? 1 tlsmgr rewrite unix - - n - - trivial-rewrite bounce unix - - n - 0 bounce defer unix - - n - 0 bounce trace unix - - n - 0 bounce verify unix - - n - 1 verify flush unix n - n 1000? 0 flush proxymap unix - - n - - proxymap proxywrite unix - - n - 1 proxymap smtp unix - - n - - smtp relay unix - - n - - smtp # -o smtp_helo_timeout=5 -o smtp_connect_timeout=5 showq unix n - n - - showq error unix - - n - - error retry unix - - n - - error discard unix - - n - - discard local unix - n n - - local virtual unix - n n - - virtual lmtp unix - - n - - lmtp anvil unix - - n - 1 anvil scache unix - - n - 1 scache dovecot unix - n n - - pipe flags=DRhu user=mtauser:users argv=/usr/local/libexec/dovecot/deliver -f ${sender} -d ${recipient}
Exim (configure)
Código :domainlist relay_to_domains = hostlist relay_from_hosts = localhost : 10.0.0.0/8 exim_user = mtauser exim_group = users smtp_accept_max = 500 acl_smtp_rcpt = acl_check_rcpt acl_smtp_data = acl_check_data daemon_smtp_ports = 25 hide mysql_servers = 127.0.0.1/mail/mtauser/minhasenha domainlist local_domains = ${lookup mysql{SELECT name AS domain FROM domain WHERE name='${quote_mysql:$domain}'}} never_users = root host_lookup = * rfc1413_hosts = * rfc1413_query_timeout = 5s ignore_bounce_errors_after = 2d timeout_frozen_after = 7d begin acl acl_check_rcpt: accept acl_check_data: accept begin routers dnslookup: driver = dnslookup domains = ! +local_domains transport = remote_smtp ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8 no_more system_aliases: driver = redirect allow_fail allow_defer data = ${lookup mysql{SELECT rcpt FROM aliases WHERE alias='${quote_mysql:$local_part@$domain}'}} file_transport = address_file pipe_transport = address_pipe userforward: driver = redirect check_local_user file = $home/.forward no_verify no_expn check_ancestor file_transport = address_file pipe_transport = address_pipe reply_transport = address_reply localuser: driver = accept condition = ${lookup mysql{SELECT mail FROM users WHERE mail='${quote_mysql:$local_part@$domain}'}} # transport = dovecot_delivery transport = local_delivery cannot_route_message = Unknown user begin transports remote_smtp: driver = smtp local_delivery: driver = appendfile file = /dev/null delivery_date_add envelope_to_add return_path_add dovecot_delivery: driver = pipe command = /usr/local/libexec/dovecot/deliver -d $local_part@$domain -f $sender_address message_prefix = message_suffix = log_output delivery_date_add envelope_to_add return_path_add user = mtauser group = users temp_errors = 64 : 69 : 70: 71 : 72 : 73 : 74 : 75 : 78 address_pipe: driver = pipe return_output address_file: driver = appendfile delivery_date_add envelope_to_add return_path_add address_reply: driver = autoreply begin retry begin rewrite begin authenticators
Selor (selor.conf)
Código :Port 25 Server_name "localhost" User "mtauser" Group "users" Event.connection "/usr/local/selor/rules_connection" Event.from "/usr/local/selor/rules_from" Event.rcpt "/usr/local/selor/rules_rcpt" Event.data "/usr/local/selor/rules_data" Module "/usr/local/selor/mod/selor_mysql.so /usr/local/selor/mod/selor_mysql.conf" Pid_file "/var/run/selor.pid" Timezone "" Cp_errors_path "/var/spool/selor/errors" Temp_path "/var/spool/selor/tmp" Queue_path "/var/spool/selor" Report_file "/usr/local/selor/error_report.txt" Dlocal "/usr/local/libexec/dovecot/deliver -d %l <" Dlocal_max_procs 5 Dlocal_type 0 Postmaster "postmaster@localhost" Subject_error_msg "[Erro na entrega do email][Mail delivery error]" Report_from "<MAILER-DAEMON@localhost>" Auth_relay 1 Timeout 30 Connect_timeout 30 Resolve_all 1 Max_msgs_per_cnx 100 Max_rcpts 100 Max_mail_size 52428800 Max_header_size 51200 Max_attempts 48 Max_error_report 3 Mx_alias_ip 1 Cp_errors 1 Hshow_user 1 Proto_level_check 0 From_level_check 1 Rcpt_level_check 0 Auth_tolerance 3 Incorrect_pass_delay 3 No_mailbox_delay 3 Immed_delivery 0 Queue_time 15 Lavg_queue 20 Lavg_negative 40 Force_alias_seek 0 Seek_df_alias 0 Central_log "/var/log/selor/selor.log" Sumary_log "/var/log/selor/selor_summary.log" Warning_log "/var/log/selor/selor_wrn.log"
Site dos projetos:
MTA Selor: http://www.mtaselor.com.br
Postfix: http://www.postfix.org
Exim: http://www.exim.org
Comentários
+ Enviar Comentário