PHP-FPM erstellt zu viele Prozesse und verbraucht die gesamte CPU

PHP-FPM erstellt zu viele Prozesse und verbraucht die gesamte CPU

Dies ist eine dringende Frage. Meine AWS-Instanz mit 4 GB RAM und 2 vCPU wird durch zu viele php-fpm-Prozesse erschöpft.

PHP-FPM beginnt, zu viele Prozesse zu erstellen, was vorher nicht der Fall war. Dies führt zu einem langsamen Laden der Site. Ich kann nicht herausfinden, warum das passiert.

Meine php.ini-Konfiguration:

html errors = off
precision = 14
output_buffering = 4096
serialize_precision = 17
max_execution_time = 300
max_input_time = 60
max_input_vars = 5000
log_errors_max_len = 1024
post_max_size = 27M 
upload_max_filesize = 27M 
max_file_uploads = 20
default_socket_timeout = 60
pdo_mysql.cache_size = 2000
memory_limit = 256M

www.conf:

pm = dynamic
pm.max_children = 35
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 1000

Screenshot des obersten Befehls: Ausgabe des Top-Befehls

Antwort1

Beantwortung Ihrer Frage

In www.conf ändern Sie dies (35 Prozesse)

pm.max_children = 35
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 1000

dazu (8 Prozesse) - oder eine beliebige Zahl

pm.max_children = 8
pm.start_servers = 4
pm.min_spare_servers = 1
pm.max_spare_servers = 2
pm.max_requests = 1000

Sie können diesen Tippfehler auch korrigieren

max_file_uploads = 20 = 20

Beantwortung der Frage in den Kommentaren

Als Hintergrund gibt pm.max_children an, wie viele PHP-Threads für die Bearbeitung von Anfragen verfügbar sind. Wenn kein Thread verfügbar ist, wird eine Anfrage bis zum Timeout des Webservers in die Warteschlange gestellt, bis eine Arbeit verfügbar ist.

PHP ist sehr speicherintensiv und ziemlich CPU-intensiv. Wenn Sie genug RAM für (sagen wir) 10 PHP-Threads haben, aber 30 zuweisen, wird Ihr Server auslagern und die Leistung wird schrecklich sein. Wenn Sie zu viel CPU zuweisen, wird es langsamer, aber es wird nicht so schlimm sein wie zu wenig RAM.

Im Allgemeinen sollten Sie herausfinden, wie viele PHP-Worker ausgeführt werden können, ohne den RAM Ihres Servers zu überlasten. Angenommen, Ihr Server verwendet 2 GB RAM, PHP ist deaktiviert, und jeder Thread verwendet 100 MB RAM. Dann können Sie etwa 20 PHP-Worker haben. Sie sollten versuchen, eine Überlastung des RAM zu vermeiden, da dieser als Festplattencache verwendet wird. Lassen Sie also etwas RAM frei.

Sie müssen ein Gleichgewicht zwischen langsamen PHP-Threads und Warteschlangen finden. Das kann Ihnen niemand abnehmen. Sie müssen experimentieren, bis Ihr Server voll ausgelastet ist, aber nicht in Schwierigkeiten gerät. Aber beginnen wir mit maximal 10 Threads und sehen dann weiter. Verwenden Sie „top“, um den freien Speicher zu überwachen, aber für den Speicher müssen Sie möglicherweise die Spalte „res“ (im Speicher resident, nehme ich an) anstelle von „virt“ verwenden, um die PHP-RAM-Nutzung abzuschätzen.

Opcache

Ich vermute (weiß es aber nicht genau), dass der Rat, den Opcache zu aktivieren, veraltet ist, da PHP7 ziemlich gut optimiert und wahrscheinlich standardmäßig aktiviert ist.

Zwischenspeicherung

Der Schlüssel zu einer guten Leistung mit PHP ist das Caching. Anonyme Benutzer, die auf eine nicht angepasste Seite zugreifen, können oft zwischengespeichert werden, selbst wenn es nur für 1/5/60 Sekunden ist, kann es auf einem stark ausgelasteten Server eine große Hilfe sein. Stellen Sie sicher, dass Ihre Caching-Header das Ablaufdatum der Seite richtig beschreiben, und konfigurieren Sie dann Nginx/Apache so, dass es entsprechend zwischenspeichert – wenn Sie einen Webserver verwenden.

Sie können statische Ressourcen auch auf einem CDN zwischenspeichern, z. B. CloudFront/CloudFlare (beachten Sie, dass CloudFlare eine kostenlose Stufe hat und gut mit AWS funktioniert). Das verbraucht zwar nicht viel CPU oder RAM, spart aber Bandbreite. Auf einem ausgelasteten Server hilft jedes Bit.

Antwort2

Ich würde prüfen, welche Art von CPU Sie haben. Wenn Sie Graviton-CPUs verwenden, ist das Verhältnis zwischen CPU und Threads 1:1.

d. h. die CPU-Anzahl ist die Zahl, die Sie als Zahl haben sollten pm.max_children. Wenn Sie Angst vor Speicherlecks haben oder dass es sich um ein wiederkehrendes Problem handelt, können Sie immer die pm.max_requestsFunktion verwenden und sie auf einen geeigneten Wert einstellen.

Dieser Wert hängt in gewisser Weise davon ab, wie schnell Ihr Leck wächst. Ist er zu klein, kann es hin und wieder zu fehlerhaften Gateways kommen.

verwandte Informationen