Ich habe gelesendiese Antwort zum Verständnistop
, sowie man top
, aber ich glaube, ich habe immer noch Probleme, die präsentierten Daten aus top
in 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 top
anzuzeigen :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:
- Was
VIRT
zeigt die Spalte anGenau genommen? Ich verstehe, dass es sich um virtuellen Speicher handelt, aber in Zeile 2 der Speicherzusammenfassung kann ich sehen, dass es gibt1052.0 avail Mem
, während die Prozesse in derVIRT
Spalte insgesamt viel mehr ergeben. - Wie hoch ist
1052.0
der verfügbare Swap-/virtuelle Speicher, wenn0.0
insgesamt genügend Speicher vorhanden ist? - Wie kann nur
692.3
Speicher verwendet werden, wenn die Summe der%MEM
Spalten ist88.6%
? Sollte sie nicht mindestens sein1935 * 0.886 = 1714
? Es sieht so aus, als ob ich dieser Zahl nahe komme, wenn ich die1065.7 buff/cache
zu diesen addiere692.3
, aber was ist der Grund dafür? - Warum schläft der Master-Prozess (wie in der
S
Spalte angegeben)? Sollte nicht zumindestEsin Betrieb sein?
Meine größte Sorge
Die memory_limit
Einstellung 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 1935M
ich insgesamt habe.
Außerdem beträgt die Gesamtsumme des Speichers in der RES
Spalte 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 256M
auf zu reduzieren 128M
und pm.max_children
vom Standardwert 50
auf 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 , RES
sollte sie mit der Summe von used
und übereinstimmen buff/cache
. Dies liegt daran, dass buff/cache
Daten für diese Prozesse dargestellt werden und zwar nicht sofort verfügbar sind, aber in Kürze verfügbar sein sollten.
Zu memory_limit
und 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_children
Ihr 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.