Temos vários servidores configurados no Debian 11 (Bullseye). Um dos processos que executamos em todos os servidores em intervalos regulares durante o dia, com o cron, é um script perl que lê um banco de dados MySQL e envia e-mails com dados relevantes. O número de e-mails varia, mas geralmente fica entre 5 e 20 por lote. Exceto durante a noite, onde outro processo irá compilar informações e preparar centenas de emails. Geralmente todos são enviados com o próximo lote. Exceto em um de nossos servidores.
Instalamos este servidor há algum tempo e recentemente adicionamos um novo cliente nele. Este cliente gera um volume maior de emails do que outros. Percebemos que isso causa problemas porque nesta máquina específica os e-mails não são enviados tão rapidamente quanto em outras. Isso significa que o script Perl colocará os e-mails pendentes na fila novamente e eles começarão a se acumular.
O script perl se comunica com o Exim4 instalado localmente. A configuração que usamos é a mesma em todos os nossos servidores. Aqui está o update-exim4.conf.con
arquivo:
dc_eximconfig_configtype='smarthost'
dc_other_hostnames=''
dc_local_interfaces='127.0.0.1 ; ::1'
dc_readhost='******.com'
dc_relay_domains=''
dc_minimaldns='false'
dc_relay_nets=''
dc_smarthost='1**.***.***.**6'
CFILEMODE='644'
dc_use_split_config='true'
dc_hide_mailname='true'
dc_mailname_in_oh='true'
dc_localdelivery='mail_spool'
Como você pode ver, o Exim se conectará a outro de nossos servidores, o smarthost rodando postfix, de onde cada email é enviado ao seu destino final.
O problema que temos é que os e-mails neste servidor específico começarão a ser enviados muito rápido (~20/s) e depois ficarão lentos, paralisarão, congelarão e eventualmente pararão com o seguinte erro:
unable to establish SMTP connection to (localhost) port 25
Trace begun at /usr/share/perl5/Email/Sender/Transport/SMTP.pm line 224
Email::Sender::Transport::SMTP::_throw('Email::Sender::Transport::SMTP=HASH(0x55d021f74620)', 'unable to establish SMTP connection to (localhost) port 25') called at /usr/share/perl5/Email/Sender/Transport/SMTP.pm line 174
Email::Sender::Transport::SMTP::_smtp_client('Email::Sender::Transport::SMTP=HASH(0x55d021f74620)') called at /usr/share/perl5/Email/Sender/Transport/SMTP.pm line 233
Entendo que o Exim primeiro salvará os e-mails no disco, depois os adicionará à fila e os enviará (no nosso caso) através do smarthost. Se for esse o caso, significa que pode haver algum problema de conexão entre o script perl e o Exim. Eu tentei muitas alterações de configuração, sem sucesso até agora.
Quando executo o Exim a partir da linha de comando com o -d+all
sinalizador, recebo muitos dados. A parte interessante, para mim, está nas lacunas:
[...]
12:33:00.959 394267 postfork: daemon-accept-delivery
12:33:00.959 394266 SMTP>>(close on process exit)
12:33:00.959 394266 >>>>>>>>>>>>>>>> Exim pid=394266 (daemon-accept) terminating with rc=0 >>>>>>>>>>>>>>>>
12:33:00.959 394267 exec /usr/sbin/exim4 -d=0xfff9ffff -MCd daemon-accept-delivery -Mc 1pY9HA-001eZ8-TG
12:33:00.960 394250 child 394266 ended: status=0x0
12:33:00.960 394250 normal exit, 0
12:33:00.960 394250 0 SMTP accept processes now running
12:33:00.960 394250 Listening...
[...]
12:33:02.998 394360 search_tidyup called
12:33:02.998 394360 search_tidyup called
12:33:02.998 394360 >>>>>>>>>>>>>>>> Exim pid=394360 (daemon-accept-delivery) terminating with rc=0 >>>>>>>>>>>
12:33:03.063 394365 read response data: size=75
12:33:03.063 394365 SMTP<< 250 2.1.0 Ok
12:33:03.063 394365 sync_responses expect rcpt
12:33:03.063 394365 SMTP<< 250 2.1.5 Ok
12:33:03.063 394365 SMTP<< 250 2.0.0 Ok: 1376 bytes queued as EDDF2F5F5E
[...]
12:33:03.087 394364 DSN: Remote SMTP server supports DSN: 1
12:33:03.087 394364 DSN: not sending DSN success message
12:33:03.087 394364 LOG: MAIN
12:33:03.087 394364 Completed QT=0.385s
12:33:03.087 394364 end delivery of 1pY9HC-001eag-Me
12:33:03.087 394364 search_tidyup called
12:33:03.087 394364 search_tidyup called
12:33:03.088 394364 >>>>>>>>>>>>>>>> Exim pid=394364 (daemon-accept-delivery) terminating with rc=0 >>>>>>>>>>>
**Why a 4 seconds gap here?**
12:33:07.772 394366 DNS lookup of localhost (AAAA) gave HOST_NOT_FOUND
12:33:07.772 394366 returning DNS_NOMATCH
12:33:07.772 394366 faking res_search(AAAA) response length as 65535
12:33:07.772 394366 writing neg-cache entry for localhost-AAAA-800043, ttl 86400
12:33:07.773 394366 DNS lookup of localhost (A) gave HOST_NOT_FOUND
[...]
12:33:08.417 394438 DSN: Remote SMTP server supports DSN: 1
12:33:08.417 394438 DSN: not sending DSN success message
12:33:08.417 394438 LOG: MAIN
12:33:08.417 394438 Completed QT=0.343s
12:33:08.417 394438 end delivery of 1pY9HI-001ebt-2N
12:33:08.417 394438 search_tidyup called
12:33:08.417 394438 search_tidyup called
12:33:08.417 394438 >>>>>>>>>>>>>>>> Exim pid=394438 (daemon-accept-delivery) terminating with rc=0 >>>>>>>>>>>
**Another 4-5 seconds gap**
12:33:13.146 394440 DNS lookup of ip6-localhost (AAAA) gave HOST_NOT_FOUND
12:33:13.146 394440 returning DNS_NOMATCH
O DNS lookup of localhost gave HOST_NOT_FOUND
retorno é para cada mensagem aceita e entregue, portanto provavelmente não é isso que está causando o problema.
As lacunas entre os e-mails tornam-se cada vez mais frequentes à medida que aumenta o número de mensagens processadas. O tempo que cada intervalo leva também aumenta. Eventualmente, há um tempo limite.
Aqui está um resumo do código Perl. Observe que o código real é mais complexo, com muitas classes e subclasses, mas a essência dele é esta:
# Create SMTP server
$smtp_transport = Email::Sender::Transport::SMTP->new( $params );
my $unsent_messages = get_unsent_messages( $messages_args );
foreach my $message ( @$unsent_messages ) {
# Create email and assign args
my $email = Email::Stuffer->new();
$email->to( $message->{to} );
# [...] other arguments, headers, etc.
$email->send_or_die( transport => $smtp_transport );
}
O que poderia estar causando esse problema. Como posso depurar isso e descobrir de onde vem o problema? A configuração é exatamente a mesma que temos em nossos outros servidores, que podem enviar centenas de e-mails em menos de um minuto, então duvido que seja uma configuração. Poderia de alguma forma ser uma diferença de hardware?
Usando Exim versão 4.94.2 # 2 construído em 13 de julho de 2021 16:04:57 e Postfix mail_version = 3.4.23.
Atualizar
Um loop for simples (veja abaixo) envia mensagens na velocidade da luz e sem atraso. Portanto, o problema parece vir do Perl.
for f in {1..111}; do mail -s TestDeCourriel [email protected] <<< "Mail content"; done
Segunda atualização
O mesmo loop com o s-nail conectando-se ao servidor SMTP local em vez de usar mail/sendmail pode reproduzir o problema.
for i in {1..111}; do echo "This is a test message. $(date)" | s-nail -S mta=smtp://localhost:25 -s "Some s-nail mail" [email protected]; done