Emails enviados com Perl NET::SMTP através do Exim e depois do Postfix ficam lentos quando vêm de um servidor específico

Emails enviados com Perl NET::SMTP através do Exim e depois do Postfix ficam lentos quando vêm de um servidor específico

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.conarquivo:

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+allsinalizador, 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_FOUNDretorno é 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

informação relacionada