Ständig muss PHP-FPM neu geladen werden

27

Wir haben einen ziemlich stark ausgelasteten Server mit Nginx und PHP-FPM. Wir haben 6 Websites auf diesem Server mit PHP-FPM und nginx. Software ist alles vBulletin 3.8 und WordPress. Datenbanken befinden sich auf einem separaten Server.

Da es sich um sehr beliebte Websites handelt, sind normalerweise 7-8.000 Besucher gleichzeitig online, wobei jede Seite zum größten Teil auf die Datenbank zugreift. Ich glaube, das ist die Ursache unserer Probleme.

Da wir so viele große Datenbanken auf dem MySQL-Server haben und die Abfragen in der Software ehrlich gesagt viel besser sein könnten, denke ich, dass MySQL gelegentlich nicht rechtzeitig Ergebnisse an PHP zurückgibt, was schließlich zu einem Kaskadeneffekt führt Lässt alles einfach anhalten, bis wir PHP-FPM neu laden. Danach geht es wieder gut.

Der Grund, warum ich Probleme bei der Fehlerbehebung habe, ist, dass ich in den Protokollen nichts wirklich erkennen kann. Im langsamen MySQL-Abfrageprotokoll 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 (zu PHP-FPM). Und in den PHP-FPM-Protokollen sehe ich viele Zeilen, in denen steht, dass die Ausführung abgelaufen ist (31 Sek.) Und beendet wird

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

Im Moment habe ich einfach eine Crontab, um alle 10 Minuten das php5-fpm-Reload zu warten, wodurch das Absturzproblem behoben wird. Wenn PHP neu geladen wird, gibt nginx natürlich einen 502-Gateway-Fehler aus, daher ist dies keine gute Lösung.

PHP führt den APC-Cache aus, falls dies von Bedeutung ist. Ich habe an einigen Stellen gelesen, dass APC unter bestimmten Umständen zum Hängen führen kann.

Hinweise wären hilfreich. Ich möchte mir wirklich nicht die ganze Zeit Sorgen um diese Maschine machen müssen.

Weitere Informationen können natürlich zur Verfügung gestellt werden. Sagen Sie mir einfach, was Sie brauchen.

Update: Ich habe gerade apc.php in ein Web-Root-Verzeichnis kopiert und darauf zugegriffen, um unsere Statistiken anzusehen. Die Dinge sahen gut aus. Dann klickte ich auf den Link, um zu den Benutzerstatistiken zu gelangen, und BOOMTE den Server sofort. Ich habe php-fpm neu geladen und dann die Seite mit den Benutzerstatistiken neu geladen. Wartete eine Minute, lud erneut, Server hing wieder.

Das scheint also definitiv mit APC zu tun zu haben. Die Frage ist - Wie beheben wir das?

APC Config:

[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 erzielt. 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, führen wir PHP seit fast 4 Stunden aus, ohne Nachladen, ohne Verlangsamung, ohne Abstürze. Wir verwenden APC immer noch in den vBulletin-Foren und es gibt überhaupt keine Probleme. Können wir auf irgendeine Weise feststellen, WARUM APC abstürzt? Ich würde es gerne in unseren WordPress-Installationen verwenden, aber nicht auf Kosten eines fragilen Systems.

Kevin
quelle
Können Sie APC-bezogene Einstellungen veröffentlichen?
Kyle
Ja, gute Idee. Getan.
Kevin
Wie viel RAM und Swap haben Sie auf dieser Maschine? Wie viel wird verbraucht, wenn es zu sterben beginnt?
Kyle
2
APC ist ein schrecklich fehlerhafter Albtraum und war jahrelang die einzige Ursache für solche Abstürze auf einer meiner Websites . Ich habe es endlich ganz losgeworden; und PHP ist jetzt solide. Wenn Sie zwischenspeichern möchten, versuchen Sie es mit Zend Opcache, dem Standard-Cache von PHP 5.5.
Michael Hampton
1
Ja, es war letztendlich APC, das PHP zum Absturz brachte. Als wir APC deaktiviert haben, mussten wir PHP nicht mehr ständig neu starten.
Kevin

Antworten:

27

Sie verwenden PHP-FPM, daher schlage ich vor, aggressiver damit umzugehen, wie lange PHP-FPM-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 viel zu großzügig, IMHO.

Ich würde die Anzahl für pm.max_requests für Ihre Produktionspools reduzieren . Ich denke, die Standardeinstellung ist 200. Ich würde bei 50 beginnen und sehen, wohin das führt.

Andernfalls oder ergänzend dazu können Sie auch die folgenden globalen Optionen ausprobieren (AFAIK, alle sind standardmäßig deaktiviert):

emergency_restart_threshold=3
emergency_restart_interval=1m
process_control_timeout=5s

Was bedeutet das? Wenn 3 untergeordnete PHP-FPM-Prozesse innerhalb von 1 Minute mit SIGSEGV oder SIGBUS beendet werden (dh abstürzen), soll PHP-FPM automatisch neu gestartet werden. Die Kindprozesse warten 5s auf eine Reaktion auf Signale vom Master.

Dies sollte Ihren Pool an PHP-Worker-Threads schön, frisch und sauber halten. Je länger ein Arbeiter Anfragen stellen darf, desto instabiler wird es. Es besteht auch ein höheres Risiko für Speicherlecks.

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

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

Rouben
quelle
1
Was halten Sie davon, wenn Sie nur cron verwenden, um php5-fpm stündlich neu zu starten?
CMCDragonkai
2
Das ist eine ziemlich blöde Art und Weise, und es funktioniert möglicherweise überhaupt nicht. In PHP-FPM sind eine Reihe von Optimierungen integriert, daher ist es besser, diese Optimierungsmöglichkeit zu nutzen.
Rouben
1
Diese Antwort wies mich in die richtige Richtung. Ich sah ein ähnliches Problem wie dieses selbst. Die Lösung für mich bestand darin, pmvon dynamiczu zu wechseln , ondemandund alle scheinen jetzt mit allen anderen Standardwerten einwandfrei zu funktionieren.
Llanato
(in der 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
justyy
Ich bekommeERROR: [/etc/php/7.0/fpm/pool.d/www.conf:135] unknown entry 'emergency_restart_threshold'
Deweydb