php-cgi-Speichernutzung höher als das Speicherlimit von PHP

php-cgi-Speichernutzung höher als das Speicherlimit von PHP

Ich verwende Apache mit einem Worker-MPM und PHP mit FastCGI.

Folgendes sind meine MPM-Grenzen:

StartServers         5
MinSpareThreads      5
MaxSpareThreads      10
ThreadLimit          64
ThreadsPerChild      10
MaxClients           10
MaxRequestsPerChild  2000

Ich habe mein PHP-CGI auch wie folgt eingerichtet:

PHP_FCGI_CHILDREN=5
PHP_FCGI_MAX_REQUESTS=500

Mir fällt auf, dass mein durchschnittlicher PHP-CGI-Prozess bereits beim Start über 200 MB RAM verbraucht. Mein PHP-Speicherlimit beträgt jedoch nur 128 MB.

Wie ist das möglich und was kann ich tun, um den Speicherverbrauch von PHP-CGI zu senken?

Antwort1

Es gibt Fälle, in denen PHP das konfigurierte Speicherlimit überschreiten kann (Speicher wird direkt in Erweiterungen mallociert), ich vermute jedoch, dass dies möglicherweise nicht der Fall ist.

Ich stelle fest, dass mein durchschnittlicher PHP-CGI-Prozess etwa 200+MB verwendet

Wie haben Sie das gemessen? Die meisten TXT-Segmente werden gemeinsam genutzt, daher ist die tatsächliche Speichernutzung viel geringer als das, was Sie im /proc-Dateisystem oder in ps/top sehen würden. Sie könnten zwar versuchen, die Ausgabe von lsof zu analysieren, aber in der Praxis halte ich es für viel sinnvoller, einen Schritt zurückzutreten und die Anzahl der laufenden Anfragen (z. B. anhand der Anzahl der verbundenen Sockets) zu betrachten und diese mit dem gemeldeten freien Speicher (abzüglich Puffer/Cache) zu vergleichen.

Antwort2

Das Speicherlimit in PHP ist das interne Speicherlimit, d. h. die Menge, die die Engine dem Benutzerskript über ihren privaten Allocator zuweist. Darüber hinaus gibt es aber auch Speicher, der von der Engine für ihre internen Anforderungen zugewiesen wird und nicht immer auf das Limit angerechnet wird (ein Teil davon wird berücksichtigt, aber nicht der gesamte), der von Bibliotheken zugewiesene Speicher usw. Erwarten Sie also, dass die tatsächliche Speichernutzung etwas größer als memory_limitdie Einstellung ist.

Wie oben erwähnt, beziehen sich einige der von den Tools gemeldeten Zahlen außerdem auf den für den Code, den Stapel, die OS-E/A-Puffer, den gemeinsam genutzten Speicher zwischen Bibliotheken usw. zugewiesenen Speicher. Sehen Sie sich also genauer an, welche Zahl Sie überprüfen.

verwandte Informationen