BENCHMARK ENTRE SERVIDORES DE E-MAILS

INTRODUÇÃ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 pode fazer os mesmos testes e comprovar os resultados.

Peço que, se cometi qualquer injustiça com um MTA, mande-me uma mensagem para correção do erro.

Para o Postfix e o Exim, busquei no Google por técnicas de Tuning para deixá-los o mais rápido possível. Para o Postfix, segui os passos que encontrei, principalmente no site do próprio projeto:

Para o Exim, 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.

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.

O QUE FOI USADO

 

Servidor que rodou os MTAs:

  • Sistema operacional usado: Linux Slackware 13.37.0 (64 bits);
  • Processador: Intel Dual Core 3.00GHz;
  • Memória RAM: 2 GB DDR3 1333Mhz – Kingston;
  • Placa mãe: ASUS P5G41T-M LX2/BR;
  • HD: Western Digital 80 GB 7200 RPM SATA 3.0 Gb/s;
  • Placa de rede: Realtek RTL8111/8168B, 1 GBit.

Micro que enviou os e-mails:

  • Sistema operacional usado: Windows 7 (64 bits);
  • Processador: Intel Core i5 – 1.80GHz;
  • Memória RAM: 4 GB 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”:

Link direto do programa: http://dl.icewarp.com/tools/srvtest.zip

Linux: Benchmark entre servidores de e-mails

 

TESTES

 

TESTE 1

Envio de 1000 e-mails 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: 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 e-mail.

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 2

Envio de 1000 e-mails de 1kB de tamanho sem o acionamento do MDA (deliver do Dovecot) com 30 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.

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 e-mail.

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 e-mails 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 4

Envio de 1 e-mail 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 e-mail (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ÇÃO USADOS

 

Postfix (main.cf):

# ——– 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):

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):

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):

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:

 

Rolar para cima