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.
Antworten:
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):
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.
quelle
pm
vondynamic
zu zu wechseln ,ondemand
und alle scheinen jetzt mit allen anderen Standardwerten einwandfrei zu funktionieren.ERROR: [/etc/php/7.0/fpm/pool.d/www.conf:135] unknown entry 'emergency_restart_threshold'