PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mailserver - Optimierungsansätze



royal1177
13.08.08, 00:02
Hallo zusammen,

wir betreiben momentan ein community projekt mit 4 Servern.
1x mysql DB
1x web php
1x bild-server
1x mail server

die user werden bei gewissen aktionen (z.b neue persönliche nachrichten im portal, freundschaftsanfragen) etc. per EMail benachrichtigt. Hierzu baut der web server eine smtp connection zum mail server im local net auf

nebenbei laufen viele cron jobs die den Mailserver belasten - z.b. täglicher newsletter usw.

da der mailserver mitunter sehr beschäftigt ist, brauch das php script, welches die smtp connection aufbaut, um eine neue Mail abzuliefern mitunter mehrere sekunden bis es abgearbeitet ist.

der mail server läuft schon in der minimal config ohne irgendwelche spam filter bei ausgehenden emails vom local net.

wir gehen nun davon aus, dass sich der durchsatz des mailservers in den nächsten 4 wochen mehr als verdreifachen wird, wodurch ich sehr starke performance probleme für den webserver kommen sehe.

ich habe nun angedacht, ob es nicht optimaler wäre, wenn das php script, anstatt eine direkte smtp connection zum mail server aufzubauen, alle ausgehenden mails in eine datenbank speichert und auf dem mail server ein cron job arbeitet, der diese "sql-queue" abarbeitet ?!

haltet ihr dies für sinnvoll bzw. sehr ihr noch andere möglichkeiten, wie optimierungsansätze für postfix o.ä., kommerzielle lösungen usw.?


gruß
jan

marce
13.08.08, 06:03
Über wie viele Mails / Tag reden wir denn? Die restlichen Daten lassen eigentlich nicht vermuten, wenn die HW einigermaßen aktuell ist, daß da ein Engpass bestehen würde...

-> ein paar mehr Infos zu HW / SW wären nicht schlecht...

royal1177
13.08.08, 13:19
Über wie viele Mails / Tag reden wir denn? Die restlichen Daten lassen eigentlich nicht vermuten, wenn die HW einigermaßen aktuell ist, daß da ein Engpass bestehen würde...

-> ein paar mehr Infos zu HW / SW wären nicht schlecht...

hi marce,

der mailserver ist ein core2duo, 2.4ghz, 2gb ram. Alle Server laufen auf debian etch.

momentanes mailaufkommen ist 50.000 pro Tag, aber nicht über den ganzen tag verteilt.

szenario:

user A hat eine Aktion ausgeführt, wodurch bspw 2.000 EMails vom PHP Script an den Mailserver per SMTP Connect geschickt werden.

Währenddessen PHP die 2.000 EMails von user A ausliefert, macht User B eine Aktion - bspw. schickt eine Freundschaftsanfrage, so dass ebenfalls eine EMail ausgeliefert wird. Nun brauch das Script von User B aber einige Sekunden bis es abgearbeitet ist, da der Mailserver noch damit beschäftigt ist, die 2.000 EMails von User A abzuarbeiten, um die Email "dazwischenzumogeln"

Es ist momentan noch akzeptabel. Aber wenn die Seite weiter so gut läuft, dürften aus den einigen Sekunden mit Sicherheit 10 oder 20 sekunden werden.

UzumakiNaruto
13.08.08, 13:53
was sind das für aktionen von user A?
2000 ist ja schon was.

solche massenmails würde ich mit einer niedrigen priorität ausstatten (ob das ein smtp vorsieht .. kp) und einzelne mails bevorzugen.

notfalls müsstest du selber was programmieren um diee prio zu haben. eine datenbank die die daten bereit hält.

php guckt rein, nimmt sich die den datensatz mit der höchsten prio und verschickt sie usw.

bla!zilla
13.08.08, 14:04
Prios gibt es bei SMTP nicht. Ich glaube eher das hier ein Design-Problem vorliegt.

royal1177
13.08.08, 14:18
@uzumakiNaruto

beispielsweise verfasst User A eine neue Nachricht in einem Forum.
Nun werden alle Mitglieder des jeweiligen Forums EINMALIG bis zu ihrem nächsten Besuch über den neuen Post im Forum per EMail Informiert.

Wenn das Forum nun bspw. 2000 Mitglieder hat, gehen 2.000 EMails raus.


@bla!zilla

ich denke nicht das es sich um ein Design Problem handelt, sondern eher um ein PHP / Smtp Problem.

Momentan sieht es wie folgt aus:

Wenn nun User A wie im obigen beispiel erklärt, ein neuen Post verfasst, geht das PHP Script nun wie folgt vor:

- insert des neuen Posts in die SQL
- select aller mitglieder des Forums, die die einmalige Benachrichtigung bis zu ihrem nächsten Besuch des Forums bekommen sollen
- php script baut eine smtp verbindung zum Mailserver im Localnet auf und hält diese solange offen, um alle nachfolgenden EMails über diese eine Connection zu versenden
- for schleife 1 - 2000 erstellt nun die personalisierten EMails an die 2.000 user:

-- "hallo Heinz Mustermann,

Erika Musterfrau hat soeben einen neuen Post im Forum FooBar veröffentlicht. Klicke hier"

--

-- emails werden an die Smtp connection übergeben



so. und nun kommen dann folgende probleme

a) 2.000 EMails quälen das PHP Script mit der Schleife, Generierung und der übergabe der jeweiligen Mails an den Mailserver mitunter mehrere Minuten, wodurch der User mehrere Minuten wwarten muss, bis der Seitenaufbau beendet wird. Fazit: Wird niemand tun und das Script wird abbrechen

b) Wenn User B nun irgendeine Aktion ausführt die ebenfalls den Versand von einer oder mehreren EMails erfordert, hängt User B noch länger in der Warteschleife...

bla!zilla
13.08.08, 14:21
so. und nun kommen dann folgende probleme

a) 2.000 EMails quälen das PHP Script mit der Schleife, Generierung und der übergabe der jeweiligen Mails an den Mailserver mitunter mehrere Minuten, wodurch der User mehrere Minuten wwarten muss, bis der Seitenaufbau beendet wird. Fazit: Wird niemand tun und das Script wird abbrechen

b) Wenn User B nun irgendeine Aktion ausführt die ebenfalls den Versand von einer oder mehreren EMails erfordert, hängt User B noch länger in der Warteschleife...

Ich bin kein Entwickler, aber ich denke wenn das kein Design-Problem ist, dann gibt es keine Design-Probleme.

cane
13.08.08, 14:28
@royal1177

Schau dir doch mal an wie vernünftige Foren, z.B. vBulletin, oder die Drupal Massmailing Module das handhaben.

mfg
cane

royal1177
13.08.08, 14:29
ich halte es für ein Performance problem aufgrund der tatsache das doch relativ viel mails rausgehen

daher meine frage im eröffnungspost hinsichtlich optimierungsansätze- wie z.b. alle ausgehenden EMails an eine SQL zusenden, anstatt diese direkt dem mailserver zu übergeben.
der Mailserver könnte die sich dann bequem, aus der sql holen und versenden, wodurch die scriptlaufzeit vom aufzurufenden script durch den user weder gefährdet noch verlangsamt wird.

bla!zilla
13.08.08, 14:36
Also Schleifen waren noch nie performant, daher kann ich Canes Vorschlag, sich das mal bei anderen Systemen anzusehen, nur befürworten.

royal1177
13.08.08, 15:23
also drupal mass mailing module arbeitet auf datenbank basis.
ich hatte mir jetzt nur das modul runtergeladen, nicht das komplette drupal

ich denke einfach mal, dass drupal, die durch das modul generierten und in der db abgelegten mails dann per cron oder mittels php cli versendet.

vbulletin konnte ich mir nich anschauen. kostet 179EUR ;-)

ich hab nun auf nem testserver (apache und mysql auf der gleichen maschine) einen Benchmark gemacht. Um 2.000 personalisierte EMails zu generieren benötigt das Script 4 Sek. - ein akzeptabler wert wie ich finde.....

ich werde dann wohl diesen weg weitergehen und richte einen cronjob auf dem mailserver ein, der die mails aus der sql holt und versendet...