Ver Feed RSS

lpriori

Benchmark entre Servidores de Emails

Avalie este Post de Blog
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
Clique na imagem para uma versão maior

Nome:	         image001.jpg
Visualizações:	304
Tamanho: 	78,7 KB
ID:      	59331


Servidor POP3/IMAP usado:
Dovecot 2.2.12. Compilado com :
Código :
./configure --with-mysql
make
Obs: O Dovecot foi instalado apenas para que fosse possível usar seu MDA ( deliver )

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)



Clique na imagem para uma versão maior

Nome:	         image003.gif
Visualizações:	305
Tamanho: 	4,8 KB
ID:      	59332
Clique na imagem para uma versão maior

Nome:	         image005.gif
Visualizações:	290
Tamanho: 	4,2 KB
ID:      	59333
Clique na imagem para uma versão maior

Nome:	         image007.gif
Visualizações:	278
Tamanho: 	4,6 KB
ID:      	59334



TESTE 2
Envio de 1000 emails 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 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)



Clique na imagem para uma versão maior

Nome:	         image009.gif
Visualizações:	258
Tamanho: 	4,8 KB
ID:      	59335
Clique na imagem para uma versão maior

Nome:	         image011.gif
Visualizações:	241
Tamanho: 	4,2 KB
ID:      	59336
Clique na imagem para uma versão maior

Nome:	         image013.gif
Visualizações:	282
Tamanho: 	4,6 KB
ID:      	59337



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)


Clique na imagem para uma versão maior

Nome:	         image015.gif
Visualizações:	276
Tamanho: 	5,6 KB
ID:      	59338
Clique na imagem para uma versão maior

Nome:	         image017.gif
Visualizações:	267
Tamanho: 	4,3 KB
ID:      	59339
Clique na imagem para uma versão maior

Nome:	         image019.gif
Visualizações:	269
Tamanho: 	4,5 KB
ID:      	59340


TESTE 4
Envio 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.



Clique na imagem para uma versão maior

Nome:	         image021.gif
Visualizações:	264
Tamanho: 	4,4 KB
ID:      	59341
Clique na imagem para uma versão maior

Nome:	         image023.gif
Visualizações:	259
Tamanho: 	4,5 KB
ID:      	59342


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

Atualizado 27-05-2015 em 21:37 por lpriori

Categorias
Artigos , Dicas

Comentários


+ Enviar Comentário