Postfix Performance-Optimierung

hammerhans

New Member
Hallo allerseits,

ich verschicke aus einem Java-Programm Emails mit postfix (per sendmail-Befehl), d.h. die Emails werden in den maildrop queue geschrieben.

Wenn ich viele Emails auf einmal verschicken möchte (Einlieferung aus der Java-App ca. 3000 / Minute), bekomme ich Probleme mit der Performance von Postfix. Es sieht dann exemplarisch so aus:

delays=137/0.3/0.6/0.14

Offensichtlich ist hier die "time before queue manager, including message transmission;" das Problem. Also die Zeit, bevor die Email in die active queue aufgenommen wird.

Die Postfix-Seite sagt dazu, dass der pickup Service Mails aus dem maildrop queue in den active queue schreibt. Da pickup single threaded und i/o bound ist, scheint das der Performance-Killer zu sein, oder?

Außerdem steht da
Note, you should not attempt to deliver large volumes of mail via the pickup(8) service.


Nun meine Fragen:

1)Wenn pickup die Schwachstelle ist, gibt es eine Möglichkeit dessen Performance zu optimieren ohne schnellere Hardware? Beispielsweise indem ich statt in den maildrop queue direkt in die active queue schreibe (geht das überhaupt)?

2) Wie soll man "large volumes" überhaupt verschicken, wenn pickup nicht verwendet werden soll?


Vielen Dank im Voraus!
 

Huschi

Moderator
Nutze das qshape-Tool um erstmal sicher zu stellen wo Dein Flaschenhals ist.

Bei 3000 Emails pro Minuten per sendmail kann Pickup tatsächlich der Flaschenhals sein. Dann nutze SMTP um die Emails ein zu liefern. Hierzu muss ggf. der SMTPD getuned werden um diese Menge aufzunehmen.
Ggf. würde ein weiterer SMTPD-Dienst auf einem eigenen Port hilfreich sein, der nur auf Localhost lauscht und weder SMTP-Auth, Viren- und Mailsscanner nutzt.

huschi.
 

hammerhans

New Member
Hey Huschi,

danke für deine Antwort.
Um eine Analyse mittels qshape durchzuführen, habe ich gerade 10.000 Emails an lokale Adressen versendet.
Die Auswertung von qshape ergab nichts Außergewöhnliches (wie im Beispiel healthy queue im Link).
Allerdings waren im mailq mehrere 1000 Emails gleichzeitig und es traten weiterhin große Verzögerungen auf:
delays=761/0/0/0.08
Noch einmal zum Klarstellen: Ich möchte die outbound-Rate verbessern, also wie viele Emails pro Zeiteinheit verschickt werden können. Die Entgegennahme von Emails (incoming) ist kein Problem.

Mit SMTP hört sich interessant an. Wie würde man das machen? Hast du da mehr Informationen?
 

Huschi

Moderator
habe ich gerade 10.000 Emails an lokale Adressen versendet.
Die Frage ist: Wie? In welchem Zeitraum? Von wo?

Die Auswertung von qshape ergab nichts Außergewöhnliches
Fakten?

Ich möchte die outbound-Rate verbessern
Das ist klar. Aber jede Email muss auch erstmal ins System kommen. Falls der Pickup das Problem ist, sollte er umgangen werden, oder?

Mit SMTP hört sich interessant an. Wie würde man das machen?
Ähnlich einer Konfiguration mit Amavis. Einfach in der master.cf einen weiteren Port belegen, auf smtpd setzten und per Parameter die Einträge in der main.cf so überschreiben, dass alle Performance fressende Dinge nicht zwischen geschaltet werden. Und natürlich dass er nur auf localhost lauscht.

Für Dein Java-Programm brauchst Du nur eine der vielen SMTP-Bibliotheken wählen und einbauen.

huschi.
 

hammerhans

New Member
Ok nach weiterem Tests mit smtp-source stellt sich heraus, dass die injection mittels smtp tatsächlich deutliche Geschwindigkeitsvorteile bringt.
Nun haben sich die delays verschoben (insgesamt sind sie deutlich kleiner)
delays=0.26/121/0/0.1
außerdem ist nun auch qshape nützlich:
T 5 10 20 40 80 160 320 640 1280 1280+
TOTAL 842 842 0 0 0 0 0 0 0 0 0
xxxx.de 842 842 0 0 0 0 0 0 0 0 0
Das spricht für die These, dass pickup tatsächlich der Flaschenhals war.
Nun kommen die Delays also durch den qmgr zustande.
Welche Möglichkeiten gibt es da, etwas zu optimieren?
Danke!
 
Last edited by a moderator:

hammerhans

New Member
Ähnlich einer Konfiguration mit Amavis. Einfach in der master.cf einen weiteren Port belegen, auf smtpd setzten und per Parameter die Einträge in der main.cf so überschreiben, dass alle Performance fressende Dinge nicht zwischen geschaltet werden. Und natürlich dass er nur auf localhost lauscht.

Für Dein Java-Programm brauchst Du nur eine der vielen SMTP-Bibliotheken wählen und einbauen.

huschi.

Ok, vielen Dank!
Das werde ich probieren.

Gibt es ansonsten noch eine Möglichkeit die Zeit, die die Emails im qmgr verbringen, zu verkürzen? (siehe letzter Beitrag)
 

Huschi

Moderator
Zitat des Jahrhunderts: "Luke, nutze die Macht!"

Lass Dir mit qshape die Queues einzeln anzeigen: maildrop, incoming, active, deferred.

huschi.
 

hammerhans

New Member
"Luke, nutze die Macht!"
:rolleyes:

Vorgehen: per smtp-source 10.000 Emails lokal versendet
Ergebnis: im deferred und im maildrop keine E-Mails (war zu erwarten).
Im incoming während der Einlieferung (dauerte ca. 50s) max. 50 Emails
Im active sammelten sich dagegen jede Menge - max. ca. 9500 Emails, die dann nach und nach abgebaut wurden

Also kommt der postfix jetzt mit dem Versenden nicht "hinterher"...?
 

Huschi

Moderator
Grundsätzlich gilt die Postfix eigene Tuning-Page: http://www.postfix.org/TUNING_README.html#mailing_tips
Im Endeffekt läuft es auf "default_process_limit" in der main.cf und der "maxproc" Einstellung in der master.cf für "smtp" hinaus.
Dies muss natürlich im Einklang mit Deinem verfügbaren Speicher geschehen.

/edit:
Ich vergaß: Die Timeouts drastisch runter ziehen, damit die Prozesse nicht so lange Blockiert sind.

huschi.
 
Top