Die Verwendung des Befehls „top“ zeigt, dass PHP-FPM-Prozesse mehr Speicher verwenden als verfügbar ist

Die Verwendung des Befehls „top“ zeigt, dass PHP-FPM-Prozesse mehr Speicher verwenden als verfügbar ist

Ich habe gelesendiese Antwort zum Verständnistop, sowie man top, aber ich glaube, ich habe immer noch Probleme, die präsentierten Daten aus topin tatsächliche Informationen umzuwandeln.

Ich bin bei einer Amazon EC2-Instanz angemeldet, die Teil einer Lastenausgleichsgruppe ist. Sie führt PHP FPM aus und ich habe gefiltert, um nur die Prozesse topanzuzeigen :php-fpm

top - 11:27:43 up 18:59,  2 users,  load average: 0.59, 0.79, 0.74
Tasks: 171 total,   1 running, 125 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  9.1 sy,  0.0 ni, 90.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   1935.6 total,    177.7 free,    692.3 used,   1065.7 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.   1052.0 avail Mem

  PID USER            PR    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                   
 1566 root            20  356.2m  30.5m  23.5m S        1.6   0:02.14 php-fpm: master process (/etc/php-fpm.conf)
 2188 webapp          20  442.2m  51.3m  31.8m S        2.7   2:18.47 php-fpm: pool www
 2189 webapp          20  442.1m  50.8m  30.4m S        2.6   2:19.21 php-fpm: pool www
 2190 webapp          20  444.2m  52.6m  30.4m S        2.7   2:20.14 php-fpm: pool www
 2191 webapp          20  442.1m  51.1m  31.3m S        2.6   2:22.69 php-fpm: pool www
 2192 webapp          20  442.2m  50.8m  31.6m S        2.6   2:19.64 php-fpm: pool www
 2193 webapp          20  436.3m  46.5m  32.0m S        2.4   2:17.29 php-fpm: pool www
 2194 webapp          20  452.2m  60.6m  30.4m S        3.1   2:19.82 php-fpm: pool www
 2195 webapp          20  438.1m  48.0m  31.6m S        2.5   2:17.78 php-fpm: pool www
 2197 webapp          20  442.2m  50.9m  30.6m S        2.6   2:18.28 php-fpm: pool www
12626 webapp          20  443.6m  50.4m  28.4m S        2.6   0:37.02 php-fpm: pool www
12627 webapp          20  443.5m  50.3m  28.6m S        2.6   0:35.68 php-fpm: pool www
12628 webapp          20  438.0m  45.1m  29.1m S        2.3   0:36.28 php-fpm: pool www
12629 webapp          20  443.9m  51.4m  29.3m S        2.7   0:35.26 php-fpm: pool www
12630 webapp          20  441.6m  48.9m  29.5m S        2.5   0:34.90 php-fpm: pool www
12631 webapp          20  443.6m  50.5m  28.7m S        2.6   0:34.93 php-fpm: pool www
12632 webapp          20  436.0m  43.2m  29.1m S        2.2   0:36.01 php-fpm: pool www
12635 webapp          20  441.6m  48.1m  28.3m S        2.5   0:34.56 php-fpm: pool www
12636 webapp          20  446.1m  55.0m  30.8m S        2.8   0:37.10 php-fpm: pool www
12637 webapp          20  441.9m  48.8m  29.0m S        2.5   0:35.16 php-fpm: pool www
12639 webapp          20  443.6m  50.3m  28.5m S        2.6   0:34.23 php-fpm: pool www
12640 webapp          20  438.0m  44.7m  28.9m S        2.3   0:36.33 php-fpm: pool www
12641 webapp          20  442.8m  49.5m  28.4m S        2.6   0:35.51 php-fpm: pool www
12642 webapp          20  443.8m  50.8m  29.1m S        2.6   0:36.22 php-fpm: pool www
12643 webapp          20  438.0m  44.2m  29.2m S        2.3   0:33.49 php-fpm: pool www
12644 webapp          20  440.0m  47.4m  29.3m S        2.5   0:36.44 php-fpm: pool www
12645 webapp          20  441.6m  48.7m  29.0m S        2.5   0:34.38 php-fpm: pool www
12646 webapp          20  441.6m  48.5m  28.8m S        2.5   0:34.53 php-fpm: pool www
12647 webapp          20  437.6m  44.5m  28.5m S        2.3   0:34.73 php-fpm: pool www
12648 webapp          20  437.7m  44.4m  28.6m S        2.3   0:33.64 php-fpm: pool www
12649 webapp          20  440.0m  46.9m  29.0m S        2.4   0:35.81 php-fpm: pool www
12651 webapp          20  444.1m  51.1m  29.0m S        2.6   0:34.77 php-fpm: pool www
12652 webapp          20  439.8m  47.0m  29.1m S        2.4   0:35.02 php-fpm: pool www
12657 webapp          20  443.9m  51.7m  29.9m S        2.7   0:35.35 php-fpm: pool www
12658 webapp          20  438.0m  45.5m  29.3m S        2.3   0:34.81 php-fpm: pool www
12667 webapp          20  441.9m  49.6m  29.6m S        2.6   0:34.21 php-fpm: pool www

Folgendes verstehe ich nicht:

  1. Was VIRTzeigt die Spalte anGenau genommen? Ich verstehe, dass es sich um virtuellen Speicher handelt, aber in Zeile 2 der Speicherzusammenfassung kann ich sehen, dass es gibt 1052.0 avail Mem, während die Prozesse in der VIRTSpalte insgesamt viel mehr ergeben.
  2. Wie hoch ist 1052.0der verfügbare Swap-/virtuelle Speicher, wenn 0.0insgesamt genügend Speicher vorhanden ist?
  3. Wie kann nur 692.3Speicher verwendet werden, wenn die Summe der %MEMSpalten ist 88.6%? Sollte sie nicht mindestens sein 1935 * 0.886 = 1714? Es sieht so aus, als ob ich dieser Zahl nahe komme, wenn ich die 1065.7 buff/cachezu diesen addiere 692.3, aber was ist der Grund dafür?
  4. Warum schläft der Master-Prozess (wie in der SSpalte angegeben)? Sollte nicht zumindestEsin Betrieb sein?

Meine größte Sorge

Die memory_limitEinstellung in PHP ini ist auf gesetzt 256M. Das sollte bedeuten, dass jeder von FPM erzeugte Kindprozess bis zu so viel Speicher verwenden könnte, richtig? Wenn das richtig ist und ich 35 Kindprozesse habe (wie derzeit durch angezeigt top), könnten sie theoretisch bis zu Speicher verwenden (oder versuchen, ihn zu verwenden) 35 * 256 = 8960M. Das ist viel mehr, als 1935Mich insgesamt habe.

Außerdem beträgt die Gesamtsumme des Speichers in der RESSpalte 1749.6. Mit anderen Worten, der verwendete Speicher beträgt 1749/1935 = 90.38%. Aber das ist der Fall, wenn sich alle Prozesse im Ruhezustand befinden! Wenn es zu einem Datenverkehrsanstieg kommt und der Speicherverbrauch plötzlich ansteigt, klingt das katastrophal.

Ich denke darüber nach, den zulässigen Speicher von 256Mauf zu reduzieren 128Mund pm.max_childrenvom Standardwert 50auf beispielsweise zu reduzieren 12. Auf diese Weise würde der insgesamt mögliche Speicherverbrauch von PHP FPM bei liegen 12 * 128 = 1536M, was innerhalb des tatsächlich verfügbaren Speichers auf dem System liegt. Ist das sinnvoll?

Antwort1

Ein paar Dinge, die Sie beachten sollten. Zunächst sehen Sie 692.3 used, aber Sie müssen auch berücksichtigen 1065.7 buff/cache. Wenn Sie die Spalte summieren , RESsollte sie mit der Summe von usedund übereinstimmen buff/cache. Dies liegt daran, dass buff/cacheDaten für diese Prozesse dargestellt werden und zwar nicht sofort verfügbar sind, aber in Kürze verfügbar sein sollten.

Zu memory_limitund pm.max_children: Sie können das Skript mit dem höchsten Ressourcenverbrauch in Ihrer App ausführen und seinen Speicherverbrauch messen miteine memory_get_peak_usage().

Nehmen Sie diesen Wert, fügen Sie etwas Kapazität für das Wachstum Ihres Datensatzes hinzu, und schon haben Sie einen realistischen maximalen Speicherbedarf pro Skript. Mit dieser Zahl können Sie nun abschätzen, was pm.max_childrenIhr Server verarbeiten kann. Passen Sie diese Zahl nach unten an, um andere Prozesse auf Ihrem Server zu berücksichtigen.

Sie können jetzt auch einen genaueren Wert festlegen memory_limit. Beachten Sie jedoch, dass das Überschreiten dieses Werts zum Absturz Ihres Skripts führt. Ich finde, dass es oft am besten als Kontrolle funktioniert, um zu verhindern, dass außer Kontrolle geratene Skripts Ihren Dienst beenden. Ich stelle den Wert höher ein als meine speicherintensivsten Skripts, um zukünftige, komplexere Jobs zu ermöglichen.

Sie sollten auch die fpm-Variablen (pm.*) überprüfen und entsprechend anpassen.

verwandte Informationen