Z-Push verursacht Probleme mit PHP-FPM (Webserver Blockierung)

Status
Für weitere Antworten geschlossen.

InTheCloud

Benutzer
Mitglied seit
05. Jan 2012
Beiträge
64
Punkte für Reaktionen
0
Punkte
6
Ich versuche seit Monaten ein sehr ärgerliches Problem zu lösen:
Sporadisch, d.h. mehrmals täglich, sind die Webserver-Dienste (z.B. Wordpress, Owncloud, ...) für mehrere Minuten (2-30min.) nicht erreichbar. Wird z.B. die Wordpress-Seite im Browser aufgerufen, dann wird das SSL-Zertifikat ausgetauscht und die sichere Verbindung aufgebaut aber die Wordpress Seite nicht angezeigt. Der Browser bleibt minutenlang mit einer leeren Seite und dem "Laden" Donut stehen. Es kommt jedoch keine Fehlermeldung wie z.B. "der Server antwortet nicht...". Die DSM Oberfläche ist hingegen problemlos zu erreichen und der Server langweilt sich.

Nach vielen Stunden Analyse habe ich scheinbar die Ursache gefunden. Immer wenn das Problem auftritt steht im PHP-FPM Logfile ("cat /var/log/php-fpm.log") folgendes:
Rich (BBCode):
WARNING: [pool www] server reached max_children setting (20), consider raising it

Ein Reset von PHP-FPM ("/usr/syno/sbin/synoservicectl --restart php-fpm") löst das Problem temporär.
Bei Überschreitung der max. Anzahl von Kindsprozessen werden neue PHP-Anfragen anscheinend erst wieder bedient, wenn wieder ein neuer Kindsprozess gestartet werden kann.

Die Anzahl der PHP-FPM Kindsprozesse kann man nicht direkt in "/etc/php/php-fpm.conf" ändern da Synology diese im Startskript setzt.
Ich habe daher im Startskript "/etc/init/php-fpm.conf" die Zahl 20 zunächst durch 40 und jetzt sogar durch 60 ersetzt. Mit 60 taucht das Problem jetzt nur noch sehr selten auf, bisher nur einmalig in 5 Tagen.

Ich synchronisiere Emails eines Benutzers mit einem iPhone, einem iPad und einem MacBook. Zusätzlich synchronisiere ich den Kalender eines zweiten Benutzers mit zwei iPhones und einem iPad.
Auf Z-Push als Verursacher der vielen PHP-Kindsprozesse bin ich gestossen nachdem ich in der php-fpm.conf Datei "request_terminate_timeout = 600" ergänzt habe. Dann wurden ständig Kindsprozesse abgebrochen mit dem Hinweis auf z-push. Eine Internetrecherche hat ergeben, dass Z-Push long polling verwendet und Verbindungen bis zu 1h aufrecht erhält. Mit "request_terminate_timeout = 3600" wird keine Verbindung mehr abgebrochen.
Das Problem habe ich bereits seit vielen Monaten und mit mehreren Zarafa/Z-Push Versionen. Aktuell verwende ich das Zarafa-Paket 0.6.0 und Z-Push 2.1.3.

Die z-push-error.log zeigt keine Auffälligkeiten. Die z-puh.log zeigt jedoch, dass allein das eine iPhone bis zu 11x in einer Stunde (in unregelmässigen Abständen) einen Ping für Emails und 4x für den Kalender schickt.
Ich frage mich daher, ob dieses Verhalten richtig ist oder ob hier ein Bug innerhalb von z-push vorliegt. Synology berechnet die Anzahl der Kindsprozesse mit Hilfe einer Formel und hat diese bestimmt nicht sinnlos auf 20 begrenzt. Im Internet finden sich Anleitungen bei denen sich die Anzahl nach dem zur Verfügung stehenden Hauptspeicher und dem max. Speicherbedarf eines Kindsprozesses richtet. Demnach wären 60 bei mir bereits zu viel. Jedoch habe ich festgestellt, dass ein z-push Kindsprozess lediglich ein drittel des max. beobachteten Speicherbedarfs anderer Kindsprozesse belegt (ca. 15 Mbyte). Daher stellen bei mir 60 kein Problem dar. Bei DiskStations mit weniger Hauptspeicher jedoch schon.

Frage an alle ZARAFA Nutzer:
Ich wäre sehr daran interessiert, ob andere auch die Warnung "server reached max_children setting" in der php-fpm.log stehen haben.

Daher meine Bitte, dies wie folgt zu prüfen und hier zu berichten:
Rich (BBCode):
vi /var/log/php-fpm.log
/max_children
:q

Wenn dieses Problem auch noch andere haben dann werde ich im ZARAFA bzw. Z-Push Forum um Unterstützung bitten.
 
Zuletzt bearbeitet:

knueppler

Benutzer
Mitglied seit
23. Feb 2013
Beiträge
18
Punkte für Reaktionen
0
Punkte
0
Hi,

habe exakt das gleiche Problem. Ich synchronisiere 5 iPhones und 5 iPads mit 7 Usern in allen erdenklichen Kombinationen und bekomme relativ schnell den Fehler (so nach 10 min). Dann stockt (natürlich?) auch der Sync zu den Geräten bis dahin, dass Mails nicht mehr versendet werden.
Als Pflaster werden ich jetzt mal die Anzahl Child-Prozesse erhöhen.
Wenn es aber eine bessere Lösung gibt, wäre ich mehr als dankbar.

Ciao, Christian
 

fbartels

Benutzer
Mitglied seit
19. Mrz 2013
Beiträge
284
Punkte für Reaktionen
2
Punkte
24
Hallo InTheCloud,

ich habe mein Zarafa/Z-Push zwar nicht auf einer Synology laufen, kenne mich ansonsten aber recht gut damit aus. Die gute Nachricht zuerst:
Die z-push-error.log zeigt keine Auffälligkeiten. Die z-puh.log zeigt jedoch, dass allein das eine iPhone bis zu 11x in einer Stunde (in unregelmässigen Abständen) einen Ping für Emails und 4x für den Kalender schickt.
Das ist vollkommen normal. Wie schon von dir geschrieben hält der Client eine HTTP Verbindung offen um hierüber die Push Funktionalität zu erreichen. Die "pings" sind dafür da, damit die Verbindung nicht vom Server geschlossen wird.

Die DSM Oberfläche ist hingegen problemlos zu erreichen und der Server langweilt sich.
Das ist auch kein Wunder, da das DSM kein PHP benötigt (ist ein cgi Skript).

Bei Überschreitung der max. Anzahl von Kindsprozessen werden neue PHP-Anfragen anscheinend erst wieder bedient, wenn wieder ein neuer Kindsprozess gestartet werden kann.
bzw. wenn durch Beendigung einer Anfrage ein anderer Prozess freigeworden ist.

die Webserver-Dienste (z.B. Wordpress, Owncloud, ...) für mehrere Minuten (2-30min.) nicht erreichbar
+
Ich synchronisiere Emails eines Benutzers mit einem iPhone, einem iPad und einem MacBook. Zusätzlich synchronisiere ich den Kalender eines zweiten Benutzers mit zwei iPhones und einem iPad.
Was laufen dann noch so alles an (PHP-)Applikationen auf dem Server und wieviele gleichzeitige Zugriffe gibt es? Alleine Z-Push verbraucht ja schon fünf Verbindungen (dein Konto auf zwei Geräten, zweites Konto auf drei Geräten).

Synology berechnet die Anzahl der Kindsprozesse mit Hilfe einer Formel und hat diese bestimmt nicht sinnlos auf 20 begrenzt.
Ich bezweifle das hinter der "20" eine aufwändige Berechnung steckt. Meine DS213+ (512MB Ram) hat ebenfalls 20 max_children.
 

Tosoboso

Benutzer
Mitglied seit
27. Aug 2012
Beiträge
1.256
Punkte für Reaktionen
52
Punkte
74
Hi, ich hab das Problem auch sporadisch bei 5 Zugriffen plus Kalender über -kreuz und werde die Anzahl der Kind-Prozesse erhöhen plus es weiter beobachten. Im Forum sollte ein Bug / Feature Request m.E. erfolgen und wenn nur später in der Zarafa-Syno Wiki das Problem und die Lösung (Wert x2-3) erörtert wird.
Seit DSM 5.1 waren die Probleme "gefühlt" weg bzw. geringer geworden, aber ich habe gerade das Log geprüft das Problem ist immer noch da so jeden 2. Tag..

Noch eine Frage, du sagst die Änderung muss in </etc/init/php-fpm.conf> erfolgen; so etwa in line 18? <max_children=$(python2 -c "print(int(max(20,(($mem_total*0.8)//($php_memory_limit*0.6)))))") || true> => <max_children=$(python2 -c "print(int(max(40,(($mem_total*0.8)//($php_memory_limit*0.6)))))") || true> Zusätlich noch in line 20 <[ -z "$max_children" ] && max_children=20 || true> => <[ -z "$max_children" ] && max_children=40 || true> und in /etc/php/php-fpm.conf <pm.max_children = 20> => <pm.max_children = 40> So just in Case ?..
 
Zuletzt bearbeitet:

InTheCloud

Benutzer
Mitglied seit
05. Jan 2012
Beiträge
64
Punkte für Reaktionen
0
Punkte
6
Hi,
Als Pflaster werde ich jetzt mal die Anzahl Child-Prozesse erhöhen.
Ciao, Christian

Danke für Deine Rückmeldung. Ich würde mich freuen, wenn Du über das Ergebnis hier berichten könntest.

Hallo InTheCloud,
Was laufen dann noch so alles an (PHP-)Applikationen auf dem Server und wieviele gleichzeitige Zugriffe gibt es? Alleine Z-Push verbraucht ja schon fünf Verbindungen (dein Konto auf zwei Geräten, zweites Konto auf drei Geräten).

Es läuft Wordpress mit einer Seite. Die Zugriffe sind aber vernachlässigbar, da die Seite passwortgeschützt und lediglich von der Familie verwendet wird.
Ausserdem läuft Owncloud mit 6 Adressbüchern und einem Kalender (6 User). Hier kann ich aber beobachten, dass während eines Syncs 6 Kindsprozesse generiert und danach auch wieder terminiert werden.
Was ich sehr ungewöhnlich finde ist , dass ab und zu bis zu 20 neue Kindsprozesse generiert werden. Da ich von unterwegs häufig mit VPN arbeite vermute ich, dass bei einem IP-Wechsel die bestehenden Z-Push Verbindungen nicht abgebaut aber neue aufgebaut werden so dass es bis zu 1h doppelte oder gar 3-fache Verbindungen gibt (z.B. bei einem Wechsel von Mobilfunk auf WLAN und dann VPN). Ist aber nur eine Vermutung meinerseits.

Wie kann ich denn herausfinden, was genau hinter einem Kindsprozess steckt?

Ich bezweifle das hinter der "20" eine aufwändige Berechnung steckt. Meine DS213+ (512MB Ram) hat ebenfalls 20 max_children.

Dem stimme ich zu. Die genaue Formel lautet:
Rich (BBCode):
mem_total=$(grep MemTotal /proc/meminfo | awk '{printf $2}' | numfmt --from-unit=K --from=iec) || true
php_memory_limit=$(php -i | grep memory_limit | awk '{print $3}' | numfmt --from=iec) || true
max_children=$(python2 -c "print(int(max(60,(($mem_total*0.8)//($php_memory_limit*0.6)))))") || true

Bei mir ist mem_total=2.084.507.648 und php_memory=134.217.728. Damit ergibt die Formel 20,7.
Die Berechnung ist jedenfalls sehr theoretisch da diese auf der Annahme basiert, dass jeder php-fpm Prozess 60% das max. zur Verfügung stehende PHP-Limits ausschöpft. Die Z-Push Prozesse benötigen bei mir aber "nur" 15MByte. Damit könnte ich um den Faktor 5 (15 vs. 80 Mbyte) nach oben gehen...

Hi, ich hab das Problem auch sporadisch bei 5 Zugriffen plus Kalender über -kreuz und werde die Anzahl der Kind-Prozesse erhöhen plus es weiter beobachten. Ein Bug / Feature Request sollte m.E. erfolgen und wenn nur später in der Zarafa-Syno Wiki das Problem und die Lösung erörtert wird. PS: seit DSM 5.1 sind die Probleme "gefühlt" weg bzw. geringer geworden.

Mit DSM Updates werden häufig auch die PHP Versionen geändert und damit fliessen PHP-FPM Bugfixes / Änderungen ein. Bei mir ist das Problem aber auch mit DSM 5.1 häufig vorhanden.
Auch an Dich die Frage wie wir das Problem, dass häufig bis zu 20 Kindsprozesse auf einen Schlag erzeugt werden, weiter eingrenzen können? Wo sollte dann ein Bug / Feature Request erfolgen?
Ich würde mich jedenfalls freuen, wenn Du auch hier über die Auswirkung der Erhöhung der max. Anzahl der Kindsprozesse berichten könntest.
 

knueppler

Benutzer
Mitglied seit
23. Feb 2013
Beiträge
18
Punkte für Reaktionen
0
Punkte
0
Hi InTheCloud,

erhöhen auf 40 hat es bis dato gebracht. Mein iPhone synced wieder sauber und schnell.
Ich verbrauche so ca. 30 child-Prozesse bis dato. Speicherbelegung hat sich leicht erhöht, aber das spürt man bis dato nicht wirklich.

Mal schauen, ob es so bleibt.

Auf jeden Fall vielen Dank für den Hinweis, da ich seit ca. 1 Woche das Problem massiv hatte.

Ciao, Christian
 

Tosoboso

Benutzer
Mitglied seit
27. Aug 2012
Beiträge
1.256
Punkte für Reaktionen
52
Punkte
74
Bei mir ist das Problem aber auch mit DSM 5.1 häufig vorhanden.
Auch an Dich die Frage wie wir das Problem, dass häufig bis zu 20 Kindsprozesse auf einen Schlag erzeugt werden, weiter eingrenzen können? Wo sollte dann ein Bug / Feature Request erfolgen? Ich würde mich jedenfalls freuen, wenn Du auch hier über die Auswirkung der Erhöhung der max. Anzahl der Kindsprozesse berichten könntest.
Hi, wie gesagt die Probleme sind bei mir unter DSM 5.1 doch noch vorhanden und ich fahre ab jetzt mit Max-Child 40; - werde die Erfahrungen posten (und auch beobachten, ob DSM Updates den Wert wieder Resetten; wen ja, dann pack ich das in (m)ein Paktet mit Check und Repair bei jeden Restart..).

PS: Ich nehm es auf die Liste, ggf mach ich ein SPK mit DSM-UI als "Z-Push Tune Advisor" mit Log-File Inspection und schritt-weisem Hochsetzen der Child Werte..
 
Zuletzt bearbeitet:

knueppler

Benutzer
Mitglied seit
23. Feb 2013
Beiträge
18
Punkte für Reaktionen
0
Punkte
0
Guten Morgen,

so wie ich das sehe, verhält sich alles ganz normal.
Punkt ist, dass bei "exzessiver" z-Push-Nutzung eine Menge php-childProzesse benötigt werden. Dann sind 20 ein Witz und auch bei Ausbau des RAMs auf 4 GByte, was ich noch bei meiner 713+ machen werde, wären gemäß der Formel nur 40 zugelassen, was definitiv zu wenig ist für mich. Ich bin jetzt bei max 50, da ich es gestern doch auf über 40 geschafft habe.

@fbartels: wie viele Prozesse benötigt denn z-Push für die Kombi 1 Device/1 User im Maximum? Damit kann man ja die obere Grenze der z-Push-Nutzung ganz gut abschätzen

Danke, Christian
 

fbartels

Benutzer
Mitglied seit
19. Mrz 2013
Beiträge
284
Punkte für Reaktionen
2
Punkte
24
Für Z-Push braucht es so ca. 1,5 childs pro aktivem Verbindung. Wenn es jetzt also fünf Benutzer gibt, die mit jeweils zwei Geräten auf ihre Konten zugreifen braucht es schonmal 15 child Prozesse.

Aber über php-fpm laufen natürlich auch noch die ganzen anderen PHP Applikationen auf der DS.
 

InTheCloud

Benutzer
Mitglied seit
05. Jan 2012
Beiträge
64
Punkte für Reaktionen
0
Punkte
6
Noch eine Frage, du sagst die Änderung muss in </etc/init/php-fpm.conf> erfolgen; so etwa in line 18? <max_children=$(python2 -c "print(int(max(20,(($mem_total*0.8)//($php_memory_limit*0.6)))))") || true> => <max_children=$(python2 -c "print(int(max(40,(($mem_total*0.8)//($php_memory_limit*0.6)))))") || true> Zusätlich noch in line 20 <[ -z "$max_children" ] && max_children=20 || true> => <[ -z "$max_children" ] && max_children=40 || true> und in /etc/php/php-fpm.conf <pm.max_children = 20> => <pm.max_children = 40> So just in Case ?..

Korrekt, in der Datei "/etc/init/php-fpm.conf" wird die Zahl "20" zwei Mal verwendet. Ich habe beide auf "60" geändert.
Ist meiner Meinung nach schlechter Programmierstil diese Zahl undokumentiert zwei Mal an verschiedenen Stellen hart zu codieren. Besser wäre hier sicherlich eine kommentierte Variable...

Hi, wie gesagt die Probleme sind bei mir unter DSM 5.1 doch noch vorhanden und ich fahre ab jetzt mit Max-Child 40; - werde die Erfahrungen posten (und auch beobachten, ob DSM Updates den Wert wieder Resetten; wen ja, dann pack ich das in (m)ein Paktet mit Check und Repair bei jeden Restart..).

PS: Ich nehm es auf die Liste, ggf mach ich ein SPK mit DSM-UI als "Z-Push Tune Advisor" mit Log-File Inspection und schritt-weisem Hochsetzen der Child Werte..

Nach der Diskussion hier würde ich eher eine Integration in das Z-Push SPK vorschlagen. Bei der Installation sollte dieses den für den jeweiligen Server "richtigen" Wert erkennen und eintragen...

Für Z-Push braucht es so ca. 1,5 childs pro aktivem Verbindung. Wenn es jetzt also fünf Benutzer gibt, die mit jeweils zwei Geräten auf ihre Konten zugreifen braucht es schonmal 15 child Prozesse.

Aber über php-fpm laufen natürlich auch noch die ganzen anderen PHP Applikationen auf der DS.

Diese Angabe passt bei mir nicht. Wie bereits geschrieben habe ich 2 Accounts in Zarafa. Ein Account wird mit 2 Geräten und der andere mit 3 Geräten synchronisiert. Damit bräuchte ich "nur" 8 Kindsprozesse. Es sind aber um Faktor 3-4 mehr.
Ausser Z-Push läuft nicht viel bei mir.
 

knueppler

Benutzer
Mitglied seit
23. Feb 2013
Beiträge
18
Punkte für Reaktionen
0
Punkte
0
Hi,

ja, auch mir erscheint der Wert deutlich zu gering. Ich unterstelle, dass das für den idle-Zustand gilt, i.e. es wird gerade nix gepusht und somit sind nur die pings aktiv. Sobald dann eine Aktion gesynced werden muss, werden deutlich mehr Prozesse gestartet, die aber relativ kurzlebig sind. In diesem Falle schätze ich so was um die vier Prozesse User/Device. Hat der User mehrere Devices, geht es bei der Änderung für diesen User dann gleich richtig los. Dies ist aber nur "Analyse durch Draufstarren", die Leute von z-push sollten das sicherlich besser erklären können.

Sei es wie es sei, ich habe jetzt 4 Gbyte eingebaut, die max-Prozesse auf 80 erhöht und gehe davon aus, dass das jetzt reichen sollte.

Allerdings wäre sicherlich zum einen eine Bestätigung oder bessere Erklärung der z-push-Experten hilfreich und dann eine entsprechende Erläuterung im Zarafa-Wiki.

Danke, Christian
 

Tosoboso

Benutzer
Mitglied seit
27. Aug 2012
Beiträge
1.256
Punkte für Reaktionen
52
Punkte
74
Nach der Diskussion hier würde ich eher eine Integration in das Z-Push SPK vorschlagen. Bei der Installation sollte dieses den für den jeweiligen Server "richtigen" Wert erkennen und eintragen...
Ja schlage Das bitte im Zarafa / Synology Forum vor, aber ich gehe davon aus, dass dies nicht sofort umgesetzt werden kann / wird und ggf. erstmal per Wiki die Nutzer mit vi Hand anlegen sollen (auch gut). Das liegt u.A. daran, dass Z-Push für verschiedenste Umgebungen erstellt wird, u.a. Synology, Qnnap, Linux allgemein und dieses Problem liegt an der Schnittstelle Z-Push / Synology Apache. Genau wie das Problem mit den Postfix Templates, die immer gelöscht werden beim Mail-Server Upgrade liegt das in Grauzone Synology / Zarafa Zuständigkeit und wurde nie gelöst, bis ich selbts ein Paket geschrieben habe (Z-Pull-Vmail).
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat