Mit Perl NET::SMTP über Exim und dann Postfix gesendete E-Mails werden langsamer, wenn sie von einem bestimmten Server kommen

Mit Perl NET::SMTP über Exim und dann Postfix gesendete E-Mails werden langsamer, wenn sie von einem bestimmten Server kommen

Wir haben mehrere Server auf Debian 11 (Bullseye) eingerichtet. Einer der Prozesse, die wir auf allen Servern in regelmäßigen Abständen tagsüber mit cron ausführen, ist ein Perl-Skript, das aus einer MySQL-Datenbank liest und E-Mails mit relevanten Daten sendet. Die Anzahl der E-Mails variiert, liegt aber normalerweise zwischen 5 und 20 pro Batch. Außer nachts, wenn ein anderer Prozess Informationen zusammenstellt und Hunderte von E-Mails vorbereitet. Diese werden normalerweise alle mit dem nächsten Batch gesendet. Außer auf einem unserer Server.

Wir haben diesen Server vor einiger Zeit installiert und vor Kurzem einen neuen Client hinzugefügt. Dieser Client generiert ein höheres E-Mail-Volumen als andere. Wir haben festgestellt, dass dies zu Problemen führt, da die E-Mails auf diesem bestimmten Computer nicht so schnell gesendet werden wie auf anderen. Dies bedeutet, dass das Perl-Skript die ausstehenden E-Mails erneut in die Warteschlange stellt und sie sich zu stapeln beginnen.

Das Perl-Skript kommuniziert mit lokal installiertem Exim4. Die von uns verwendete Konfiguration ist auf allen unseren Servern gleich. Hier ist die update-exim4.conf.conDatei:

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'

Wie Sie sehen, stellt Exim eine Verbindung zu einem anderen unserer Server her, dem Smarthost, auf dem Postfix läuft, von wo aus jede E-Mail an ihr endgültiges Ziel gesendet wird.

Unser Problem besteht darin, dass der E-Mail-Versand auf diesem bestimmten Server zunächst sehr schnell (~20/s) erfolgt, dann aber langsamer wird, ins Stocken gerät, einfriert und schließlich mit der folgenden Fehlermeldung stoppt:

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

Meines Wissens speichert Exim E-Mails zunächst auf der Festplatte, fügt sie dann der Warteschlange hinzu und sendet sie dann (in unserem Fall) über den Smarthost. Wenn dies der Fall ist, bedeutet dies, dass möglicherweise ein Verbindungsproblem zwischen dem Perl-Skript und Exim vorliegt. Ich habe viele Konfigurationsänderungen versucht, bisher ohne Erfolg.

Wenn ich Exim mit dem Flag von der Kommandozeile aus starte -d+all, erhalte ich eine Menge Daten. Der interessante Teil liegt für mich in den Lücken:

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

Es DNS lookup of localhost gave HOST_NOT_FOUNDkommt für jede akzeptierte und zugestellte Nachricht zurück, es ist also wahrscheinlich nicht die Ursache des Problems.

Die Lücken zwischen den E-Mails werden immer häufiger, je mehr Nachrichten verarbeitet werden. Auch die Zeit, die jede Lücke in Anspruch nimmt, wird länger. Schließlich kommt es zu einer Zeitüberschreitung.

Hier ist eine Zusammenfassung des Perl-Codes. Beachten Sie, dass der eigentliche Code komplexer ist und viele Klassen und Unterklassen enthält. Der Kerngedanke ist jedoch dieser:

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

Was könnte die Ursache für dieses Problem sein? Wie kann ich das Problem beheben und herausfinden, woher es kommt? Die Konfiguration ist genau die gleiche wie die auf unseren anderen Servern, die Hunderte von E-Mails in weniger als einer Minute versenden können. Ich bezweifle also, dass es an einer Konfigurationseinstellung liegt. Könnte es irgendwie ein Hardwareunterschied sein?

Verwende Exim Version 4.94.2 #2, erstellt am 13.07.2021, 16:04:57 Uhr und Postfix Mail_Version = 3.4.23.

Aktualisieren

Eine einfache for-Schleife (siehe unten) sendet Nachrichten blitzschnell und ohne Verzögerung. Das Problem scheint also von Perl herzurühren.

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

Zweites Update

Dieselbe Schleife mit S-Nail, das eine Verbindung zum lokalen SMTP-Server herstellt, anstatt Mail/Sendmail zu verwenden, kann das Problem reproduzieren.

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

verwandte Informationen