O servidor SMTP leva mais de 30 segundos para aceitar uma mensagem, como torná-la mais rápida?

2

Um de nossos servidores SMTP está aceitando e-mails com lentidão, eis a saída típica (tempo de resposta 30+ segundos) de um script de cliente smtp:

2014-02-26 11:44:11 +0800 BEGIN
2014-02-26 11:44:11 +0800 LOGGED IN
2014-02-26 11:44:11 +0800 BEFORE SEND
2014-02-26 11:44:59 +0800 AFTER SEND
2014-02-26 11:44:59 +0800 END

O script ruby:

message = <<MESSAGE_END
From: One <[email protected]>
To: Two <[email protected]>
Subject: SMTP e-mail test

Testing 123
MESSAGE_END

def timelog(msg)
  puts "#{Time.now} #{msg}"
end

timelog("BEGIN")
Net::SMTP.start(host, 25, 'localhost', username, password, :plain) do |smtp|
  timelog("LOGGED IN")
  timelog("BEFORE SEND")
  smtp.send_message message, '[email protected]', ['[email protected]']
  timelog("AFTER SEND")
end
timelog("END")

Como posso melhorar o desempenho?

UPDATE (com informações de tempo DNS, carregando):

# time dig yahoo.com mx

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.5 <<>> yahoo.com mx
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57858
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;yahoo.com.         IN  MX

;; ANSWER SECTION:
yahoo.com.      528 IN  MX  1 mta7.am0.yahoodns.net.
yahoo.com.      528 IN  MX  1 mta5.am0.yahoodns.net.
yahoo.com.      528 IN  MX  1 mta6.am0.yahoodns.net.

;; Query time: 5 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Mar 21 12:26:09 2014
;; MSG SIZE  rcvd: 106


real        0m1.013s
user        0m0.004s
sys         0m0.004s

top , é um novo servidor, por isso quase não há carregamento:

Cpu(s):  0.2%us,  0.0%sy,  0.0%ni, 99.5%id,  0.3%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1903696k total,  1310776k used,   592920k free,   311492k buffers
Swap:  4095992k total,        0k used,  4095992k free,   822692k cached

UPDATE (telnet):

# telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 m1.example.com ESMTP Sendmail 8.14.4/8.14.4; Tue, 25 Mar 2014 14:47:04 +0800
HELO 127.0.0.1
250 m1.example.com Hello localhost [127.0.0.1], pleased to meet you
AUTH LOGIN
334 VXNlcm5hbWU6
bWUuY29t
334 UGFzc3dvcmQ6
cGFzc3dvcmQ=
235 2.0.0 OK Authenticated
MAIL FROM: [email protected]
250 2.1.0 [email protected]... Sender ok
RCPT TO: [email protected]
250 2.1.5 [email protected]... Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
Testing 12345
.
250 2.0.0 s2P6l4Dj012326 Message accepted for delivery
QUIT
221 2.0.0 m1.example.com closing connection
Connection closed by foreign host.

Observe que MAIL FROM e RCPT TO levam cerca de 20 segundos até que OK seja retornado. Os outros comandos respondem instantaneamente.

UPDATE, FEATURE ('delay_checks') :

Ativar FEATURE('delay_checks') melhora muito o tempo de resposta de 30 segundos para aproximadamente 10 segundos. O atraso de cerca de 10 segundos é entre MAIL FROM: e Sender ok :

MAIL FROM: [email protected]
(- 10 second delay -)
250 2.1.0 [email protected]... Sender ok

ATUALIZAR novamente, parece que o atraso é muito semelhante ao descrito no livro Sendmail por Bryan Costales, página 258 :

NãoéumproblemadeDNS,poisdigenslookuprespondemrapidamente:

#timenslookupmta5.am0.yahoodns.netServer:8.8.8.8Address:8.8.8.8#53Non-authoritativeanswer:Name:mta5.am0.yahoodns.netAddress:66.196.118.240Name:mta5.am0.yahoodns.netAddress:98.138.112.34Name:mta5.am0.yahoodns.netAddress:66.196.118.37Name:mta5.am0.yahoodns.netAddress:98.138.112.32Name:mta5.am0.yahoodns.netAddress:98.136.217.203Name:mta5.am0.yahoodns.netAddress:98.138.112.33Name:mta5.am0.yahoodns.netAddress:98.138.112.38Name:mta5.am0.yahoodns.netAddress:63.250.192.46real0m1.016suser0m0.001ssys0m0.006s

UPDATEcomosendmail.mc:

#cat/etc/mail/sendmail.mc|grep-v"^dnl"
divert(-1)dnl
include('/usr/share/sendmail-cf/m4/cf.m4')dnl
VERSIONID('setup for linux')dnl
OSTYPE('linux')dnl
define('confLOG_LEVEL', '14')dnl
define('SMART_HOST', 'mail03.example.com')dnl
define('confDEF_USER_ID', ''8:12'')dnl
define('confTO_CONNECT', '1m')dnl
define('confTRY_NULL_MX_LIST', 'True')dnl
define('confDONT_PROBE_INTERFACES', 'True')dnl
define('PROCMAIL_MAILER_PATH', '/usr/bin/procmail')dnl
define('ALIAS_FILE', '/etc/aliases')dnl
define('STATUS_FILE', '/var/log/mail/statistics')dnl
define('UUCP_MAILER_MAX', '2000000')dnl
define('confUSERDB_SPEC', '/etc/mail/userdb.db')dnl
define('confPRIVACY_FLAGS', 'authwarnings,novrfy,noexpn,restrictqrun')dnl
define('confAUTH_OPTIONS', 'A y')dnl
define('confCW_FILE', '/etc/mail/local-host-names')dnl
define('confDOMAIN_NAME', 'domain.example.com')dnl
define('confMAX_MESSAGE_SIZE','23271520')dnl
TRUST_AUTH_MECH('LOGIN PLAIN DIGEST-MD5 CRAM-MD5')dnl
define('confAUTH_MECHANISMS', 'LOGIN PLAIN DIGEST-MD5 CRAM-MD5')dnl
define('confTO_QUEUERETURN', '1d')dnl
define('confTO_IDENT', '0')dnl
FEATURE('delay_checks')dnl
FEATURE('no_default_msa', 'dnl')dnl
FEATURE('smrsh', '/usr/sbin/smrsh')dnl
FEATURE('mailertable', 'hash -o /etc/mail/mailertable.db')dnl
FEATURE('virtusertable', 'hash -o /etc/mail/virtusertable.db')dnl
FEATURE(redirect)dnl
FEATURE(always_add_domain)dnl
FEATURE(use_cw_file)dnl
FEATURE(use_ct_file)dnl
FEATURE(local_procmail, '', 'procmail -t -Y -a $h -d $u')dnl
FEATURE('access_db', 'hash -T<TMPF> -o /etc/mail/access.db')dnl
FEATURE('blacklist_recipients')dnl
EXPOSED_USER('root')dnl
DAEMON_OPTIONS('Port=smtp,Addr=0.0.0.0, Name=MTA M=a')dnl
FEATURE('accept_unresolvable_domains')dnl
LOCAL_DOMAIN('localhost.localdomain')dnl
MASQUERADE_AS('example.com')dnl
FEATURE(masquerade_entire_domain)dnl
MAILER(smtp)dnl
MAILER(procmail)dnl
    
por ohho 26.02.2014 / 05:11

6 respostas

4

Eu sugiro, se possível, executar alguns comandos manuais para interagir com o servidor SMTP e ver qual etapa está causando o atraso.

Observe que você deve executar isso na mesma máquina em que seu código está sendo executado. Se os resultados forem lentos, tente os mesmos comandos de uma máquina diferente para ver se ela está relacionada à máquina que está sendo enviada ou se é a mesma, independentemente do local que está sendo enviado.

• Type: telnet smtp.server.com 25 and hit enter
     The Command will connect to the smtp server on port 25 
     which is used by the SMTP server to communicate
• Type: HELO localhost and hit enter 
     You can type anything instead of localhost like yourdomain.com
• Type: MAIL FROM: [email protected] and hit enter
     Replace [email protected] with your email address
• Type RCPT TO: [email protected] and hit enter
     Replace [email protected] to the email address you want to send the email to
• Type: DATA and hit enter
• Type: this is a test email and hit enter
• Type: . and hit enter
• Type: QUIT and hit enter
    
por 21.03.2014 / 07:42
2

Você não nos diz nada sobre sua configuração, mas de acordo com o seu "log", o tempo de conexão e o tempo de processamento do envelope estão ok, é apenas o processamento do corpo da correspondência que é lento.

Então, aqui estão duas explicações, em ordem de probabilidade:

  1. Você tem um filtro de e-mail (spamassassin ou qualquer coisa) que processe todos os e-mails recebidos. É aqui que está o seu problema.
  2. A fila de mensagens do seu servidor está localizada em um compartilhamento de rede que é incrivelmente lento para acessar.

Se você precisar de mais dicas, por favor detalhe sua configuração smtp: software, arquivos de configuração, configuração do sistema operacional.

    
por 21.03.2014 / 08:14
0

Um servidor de e-mail pode realizar muitas validações do endereço do remetente. A maioria dessas validações envolve pesquisas de DNS. Se o DNS estiver configurado incorretamente no servidor ou se o domínio do remetente estiver configurado incorretamente, algumas dessas pesquisas de DNS poderão expirar. O DNS reverso no IP do cliente também pode ter sido configurado incorretamente, de forma que as pesquisas expirem.

Duas verificações que às vezes são realizadas envolvem outras comunicações de rede.

O servidor de e-mail pode se conectar ao daemon de autenticação no endereço IP do cliente. Se o cliente usar um firewall mal configurado, o pacote SYN enviado para a porta 113 será perdido. Depois de algumas tentativas, o servidor desistirá.

O servidor de e-mail também pode se conectar ao MX para o domínio do remetente para validar se o endereço do remetente existe. Essa verificação em particular é raramente usada, pois pode falhar espetacularmente se for feita de maneira errada.

Para identificar qual dos itens acima é o caso, é necessário inspecionar o tráfego da rede. Essa inspeção pode ser feita usando tcpdump ou wireshark.

    
por 30.03.2014 / 09:31
0

Tente anexar o strace ao seu processo sendmail e veja o que ele lhe dá, caso você digite manualmente o comando mail from (é claro que você deve se certificar de que ninguém mais esteja usando o serviço SMTP nesse momento. Isso deve lhe dar uma idéia melhor de qual verificação do remetente está lenta. Se não souber como usar o Steve, este simples post pode ser de alguma ajuda (especialmente nos capítulos 3 e 4).

link

    
por 30.03.2014 / 10:11
0

O fato de você estar vendo um atraso entre "MAIL FROM" e o próximo comando implica que o sendmail está validando o endereço do remetente. Isso faz sugerir strongmente um problema de DNS / rede, mas você diz que pesquisas de DNS com a mão estão OK. Se esse servidor de e-mail estiver usando um servidor DNS sob seu controle, você poderia tentar ativar o registro de consultas para ver as perguntas que estão sendo feitas (e por quanto tempo o servidor DNS está demorando para responder)?

Você diz que "um dos nossos servidores SMTP está aceitando emails com lentidão". Isso implica que seus outros servidores SMTP não exibem esse comportamento. É esse o caso? Em caso afirmativo, o que há de diferente nisso?

Se o servidor com problemas estiver em uso de produção, talvez você queira iniciar uma instância extra de escuta do sendmail em uma porta diferente, para que possa aumentar o nível de depuração. Uma alternativa seria usar strace como alxgomz sugere. Se você fizer uma conexão inicial usando o telnet, poderá apenas rastrear o processo filho que está manipulando sua mensagem, em vez de todas as conexões SMTP.

    
por 02.04.2014 / 12:59
-2

Você está usando example.com em seu teste (como seu script ruby declara)? Talvez você esteja tendo problemas quando não há registros MX a serem retornados. Você já tentou isso com endereços de e-mail reais? O atraso é apenas para determinados domínios?

    
por 21.03.2014 / 06:27