Электронные письма, отправленные с помощью Perl NET::SMTP через Exim, а затем Postfix, замедляются, если приходят с одного конкретного сервера

Электронные письма, отправленные с помощью Perl NET::SMTP через Exim, а затем Postfix, замедляются, если приходят с одного конкретного сервера

У нас есть несколько серверов, настроенных на Debian 11 (Bullseye). Один из процессов, который мы запускаем на всех серверах с регулярным интервалом в течение дня с помощью cron, — это скрипт perl, который считывает данные из базы данных MySQL и отправляет письма с соответствующими данными. Количество писем варьируется, но обычно составляет от 5 до 20 на пакет. За исключением ночи, когда другой процесс собирает информацию и подготавливает сотни писем. Обычно все они отправляются со следующим пакетом. За исключением одного из наших серверов.

Мы установили этот сервер некоторое время назад и недавно добавили на него нового клиента. Этот клиент генерирует больше писем, чем другие. Мы заметили, что это вызывает проблемы, потому что на этой конкретной машине письма отправляются не так быстро, как на других. Это означает, что скрипт Perl снова поставит в очередь ожидающие письма, и они начнут накапливаться.

Скрипт perl взаимодействует с Exim4, установленным локально. Конфигурация, которую мы используем, одинакова на всех наших серверах. Вот файл update-exim4.conf.con:

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'

Как вы видите, Exim подключится к другому нашему серверу, смарт-хосту, на котором работает Postfix, откуда каждое электронное письмо отправляется конечному получателю.

Проблема заключается в том, что электронные письма на этом сервере начинают отправляться очень быстро (~20/с), а затем замедляются, останавливаются, зависают и в конечном итоге останавливаются со следующей ошибкой:

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

Я понимаю, что Exim сначала сохраняет письма на диске, затем добавляет их в очередь, а затем отправляет их (в нашем случае) через смартхост. Если это так, то это может означать, что между скриптом perl и Exim могут быть проблемы с соединением. Я пробовал много изменений конфигурации, но пока безрезультатно.

Когда я запускаю Exim из командной строки с -d+allфлагом, я получаю много данных. Интересная часть, на мой взгляд, находится в пробелах:

[...]
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

Ошибка DNS lookup of localhost gave HOST_NOT_FOUNDвозвращается для каждого принятого и доставленного сообщения, поэтому, вероятно, проблема не в этом.

Промежутки между письмами становятся все более частыми по мере увеличения количества обработанных сообщений. Время, которое занимает каждый промежуток, также увеличивается. В конце концов наступает тайм-аут.

Вот краткое изложение кода Perl. Обратите внимание, что реальный код более сложен, с множеством классов и подклассов, но суть его такова:

# 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 );
}

Что может быть причиной этой проблемы. Как мне отладить это и выяснить, откуда возникла проблема? Конфигурация точно такая же, как и на других наших серверах, которые могут отправлять сотни писем менее чем за минуту, поэтому я сомневаюсь, что это настройка конфигурации. Может ли это быть как-то аппаратной разницей?

Используется Exim версии 4.94.2 #2, собранный 13 июля 2021 г. в 16:04:57, и Postfix mail_version = 3.4.23.

Обновлять

Простой цикл for (см. ниже) отправляет сообщения молниеносно и без задержек. Так что проблема, похоже, исходит от Perl.

for f in {1..111}; do mail -s TestDeCourriel [email protected] <<< "Mail content"; done

Второе обновление

Тот же цикл с подключением s-nail к локальному SMTP-серверу вместо использования mail / sendmail может воспроизвести проблему.

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

Связанный контент