Frage Ständig PHP-FPM neu laden


Wir haben einen relativ stark ausgelasteten Server, auf dem nginx und PHP-FPM laufen. Wir haben 6 Webseiten auf diesem Server, auf denen PHP-FPM und nginx laufen. Software ist alles vBulletin 3.8 und WordPress. Datenbanken befinden sich auf einem separaten Server.

Da es sich hierbei um sehr beliebte Websites handelt, haben wir normalerweise sieben bis achttausend Besucher gleichzeitig online, wobei jede Seite die Datenbank größtenteils erreicht. Ich glaube, das ist die Ursache unserer Probleme.

Da wir so viele große Datenbanken auf dem MySQL-Server haben, und weil die Abfragen in der Software ehrlich viel besser sein könnten, denke ich, dass MySQL gelegentlich keine Ergebnisse an PHP zurückliefern kann, was schließlich zu einem Kaskadeneffekt führt bewirkt, dass alles stoppt, bis wir PHP-FPM neu laden. Nachdem wir das getan haben, beginnen die Dinge wieder gut zu funktionieren.

Der Grund, warum ich Probleme bei der Fehlersuche habe, liegt darin, dass ich in den Logs nichts wirklich erkennen kann. Im langsamen Abfrageprotokoll von MySQL sehe ich nichts Interessantes, wenn Ausfallzeiten auftreten. In den Nginx-Protokollen sehe ich Tausende von Einträgen, die besagen, dass die Leseanforderung abgelaufen ist oder die Verbindung abgelaufen ist (To PHP-FPM). Und in den PHP-FPM-Protokollen sehe ich viele Zeilen, die sagen, dass die Ausführungszeit (31 Sekunden) abgelaufen ist

An diesem Punkt weiß ich einfach nicht, wo ich nach dem Problem suchen soll. Offensichtlich geschieht alles, was passiert, weil diese Skripte manchmal nicht schnell genug ausgeführt werden (Normalerweise werden sie in weniger als einer Sekunde geladen, aber etwas passiert, was die Ladezeit in die Höhe schnellen lässt). Dies geschieht mehrmals am Tag und ist für uns ein ziemliches Problem geworden.

Für jetzt habe ich einfach eine crontab, um php5-fpm nachzuladen, lädt alle 10 Minuten, die sich um das Absturzproblem kümmert. Natürlich, wenn PHP neu lädt, wirft nginx einen 502 Gateway-Fehler, also ist es nicht viel von einer Lösung.

PHP führt APC-Cache aus, wenn das wichtig ist. Ich habe an einigen Stellen gelesen, dass APC unter bestimmten Umständen hängen kann.

Alle Hinweise wären hilfreich. Ich möchte mich wirklich nicht ständig um diese Maschine kümmern müssen.

Weitere Informationen können natürlich bereitgestellt werden. Sag mir einfach, was du brauchst.

Aktualisieren: Ich habe gerade über apc.php in einen Webstamm kopiert und darauf zugegriffen, um unsere Statistiken anzusehen. Die Dinge sahen gut aus. Dann klickte ich auf den Link, um zu User stats und BOOM zu gelangen, der Server wurde sofort gehängt. Ich lud php-fpm nach und lud dann die Benutzerstatseite neu und es ging gut durch. Wartete eine Minute, lud wieder nach, der Server wurde wieder angehalten.

Das scheint definitiv APC zu sein. Die Frage ist - Wie können wir es reparieren?

APC-Konfiguration:

[apc]
apc.enabled="1"
apc.stat = "1"
apc.max_file_size = "2M"
apc.localcache = "1"
apc.localcache.size = "256"
apc.shm_segments = "1"
apc.ttl = "3600"
apc.user_ttl = "7200"
apc.gc_ttl = "3600"
apc.cache_by_default = "1"
apc.filters = ""
apc.write_lock = "1"
apc.num_files_hint= "10000"
apc.user_entries_hint="10000"
apc.shm_size = "1G"
apc.mmap_file_mask=/tmp/apc.XXXXXX
apc.include_once_override = "0"
apc.file_update_protection="2"
apc.canonicalize = "1"
apc.report_autofilter="0"
apc.stat_ctime="0"

Update 2: Wir haben hier einige Fortschritte gemacht. Es stellt sich heraus, dass das WordPress-Caching-Plugin (W3 Total Cache) die Abstürze verursacht hat. Wir wissen immer noch nicht warum, aber da es deaktiviert ist, haben wir PHP jetzt seit fast 4 Stunden ohne Nachladen, ohne Verlangsamung, ohne Abstürze ausgeführt. Wir verwenden immer noch APC in den vBulletin-Foren und überhaupt keine Probleme. Gibt es irgendeinen Weg, den wir bestimmen können? WARUM APC stürzt ab? Ich würde es gerne in unseren WordPress-Installationen verwenden, aber nicht auf Kosten eines zerbrechlichen Systems.


26
2018-02-13 21:47


Ursprung


Können Sie APC-Einstellungen posten, die Sie haben? - Kyle
Ja, gute Idee. Erledigt. - Kevin
Wie viel Ram und Swap hast du auf dieser Maschine? Wie viel wird verwendet, wenn es zu sterben beginnt? - Kyle
APC ist ein schrecklich buggy Albtraum, und war die einzige Quelle von Abstürzen wie diese auf einer meiner Websites für Jahre. Ich habe es endgültig losgeworden; und PHP ist jetzt solide. Wenn Sie zwischenspeichern möchten, versuchen Sie Zend Opcache, das ist auch der Standard-Cache von PHP 5.5. - Michael Hampton♦
Ja, es endete damit, APC zu sein, was PHP zum Absturz brachte. Als wir APC deaktiviert haben, mussten wir PHP nicht mehr ständig neu starten. - Kevin


Antworten:


Du verwendest php-fpm, also schlage ich vor, aggressiver zu sein, wie lange php-fpm's Kinder leben dürfen. Sie müssen den Sweet Spot zwischen kurzlebigen Fäden / Kindern und Stabilität finden. Die php-fpm Standardeinstellungen sind für jedes Produktionssystem, IMHO, großzügig.

Ich würde die Zahl für reduzieren pm.max_requests für Ihre Produktionspools. Ich denke, der Standardwert ist 200. Ich würde von 50 ausgehen und sehen, wohin das führt.

Failing / ergänzend dazu können Sie auch diese globalen Optionen ausprobieren (AFAIK sind alle standardmäßig deaktiviert):

emergency_restart_threshold=3
emergency_restart_interval=1m
process_control_timeout=5s

Was bedeutet das? Wenn 3 PHP-FPM-Kindprozesse innerhalb von 1 Minute mit SIGSEGV oder SIGBUS (d. H. Absturz) beendet werden, sollte PHP-FPM automatisch neu gestartet werden. Die untergeordneten Prozesse warten 5 Sekunden auf eine Reaktion auf Signale vom Master.

Dies sollte Ihren Pool von PHP-Worker-Threads schön, frisch und sauber halten. Je länger ein Mitarbeiter Anfragen stellen kann, desto instabiler wird er. Es besteht auch ein höheres Risiko von Speicherlecks.

Hier ist ein schöner Überblick über alle Konfigurationsoptionen, die ich hier erwähnt habe, sowie andere: http://myjeeva.com/php-fpm-configuration-101.html

Hoffe, diese Tipps helfen dir! Denken Sie daran, zu zwicken und zu beobachten, leider scheint es keine Faustregel für all das zu geben, es gibt zu viele Variablen, die das Verhalten und die Stabilität von PHP beeinflussen.


22
2018-02-16 08:20



Was ist deine Meinung über die Verwendung von Cron, um php5-fpm jede Stunde neu zu starten? - CMCDragonkai
Das ist eine ziemlich kluge Art, es zu tun, und es funktioniert vielleicht überhaupt nicht. PHP-FPM verfügt über eine Reihe von integrierten Optimierungen, daher ist es besser, diese Anpassungsfähigkeit zu nutzen. - Rouben
Diese Antwort wies mich in die richtige Richtung. Ich sah ein ähnliches Problem wie ich selbst, die Lösung für mich bestand darin, mich zu ändern pm von dynamiczu ondemand und alle scheinen jetzt mit allen anderen Standardwerten großartig zu funktionieren. - llanato
(in php-fpm.conf) sollte es "=" sein anstatt "den Schlüssel und den Wert zu trennen". Emergency_restart_threshold = 3 Emergency_restart_interval = 1m process_control_timeout = 5s - Zhihua Lai
Ich erhalte ERROR: [/etc/php/7.0/fpm/pool.d/www.conf:135] unknown entry 'emergency_restart_threshold' - deweydb