Wie viel Speicher verwendet PHP tatsächlich?

8

Ich habe bemerkt, dass es einen großen Unterschied zwischen dem, was top oder ps als Speicherverbrauch für einen PHP-Prozess gibt, gibt, verglichen mit dem, was der Prozess selbst denkt (mit memory_get_usage ).

Wie viel Speicher wird tatsächlich verwendet?

Wenn der folgende Code zusammen mit einer meiner Apps ausgeführt wird:

%Vor%

Die Ausgabe an einem zufälligen Punkt war:

%Vor%

In meinem speziellen Fall ist das ein Problem, weil ich ziemlich viele Arbeiter und Dämonen habe.

Wenn ich das PHP-Speicherlimit auf z. 128 MB für jeden dieser Daemons, die Prozesse werden nur getötet, wenn sie 128 MB erreichen, entsprechend den eigenen Messungen von PHP. Laut ps verwenden die Prozesse zu diesem Zeitpunkt jedoch jeweils etwa 200 MB.

    
Robbert 28.07.2016, 15:17
quelle

3 Antworten

2

Es sollte betont werden, was genau die von ps und memory_get_usage(true) angegebenen Werte sind.

ps -o rss gibt die tatsächliche residente Set-Größe an. Sich auf diesen Wert zu verlassen, ist eine ziemliche Falle, da er eventuell nicht ausgelagerten Speicher umfasst. Im Allgemeinen möchten Sie die USS , die eindeutige Mengengröße , die im Grunde nicht freigegebenen Speicher ist (schauen Sie sich smem(8) dafür an). Dies ist die Menge an nicht gemeinsam genutztem Speicher, die der Kernel tatsächlich für diesen Prozeß zugeordnet hat, d. H. Physisch vorhandenem nicht gemeinsam genutzten Speicher entweder in RAM oder in Auslagerungsdateien. Dies ist so nah wie möglich für "echte" Speichernutzung. [Siehe auch /proc/$PID/smaps für eine detaillierte Übersicht, wie in der Antwort von IVO GELOV erwähnt, wo Sie den Speicher, den Sie zählen möchten, durch das Analysieren dieser virtuellen Datei technisch zählen können.]

In Bezug auf memory_get_usage() meldet dies den Heap-Speicher, der tatsächlich von Systemen zugewiesen wurde, die den internen Speichermanager von PHP verwenden. Dies bedeutet, dass Bibliotheken, die direkt andere Speichermanager des Systems verwenden ( mmap(2) oder malloc(3) ) ihre Speicherauslastung hier nicht offen legen. [Dies ist zum Beispiel, warum mysqlnd viel Speicherverbrauch zeigt, während libmysqlclient dies nicht tut - letzteres verwendet malloc() intern.]

Wenn Sie true als ersten Parameter übergeben, d. h. memory_get_usage(true) , gibt es die Gesamtmenge an Speicher zurück, nach der der interne Speichermanager von PHP vom System verlangt hat. Diese Zahl ist im Allgemeinen leicht, aber nicht viel höher als memory_get_usage(false) . Es ist auch die Zahl, mit der die Einstellung memory_limit INI verglichen wird.

Wenn Sie sehen möchten, wie viele Worker Sie ausführen können, beachten Sie, dass PHP nicht viel Speicher freigibt, außer dass der Kernel den Bibliotheksspeicher und den Opcache teilt, der die Strukturen teilt (Opcodes, Klasseninformationen usw.). Daher sollte das Shared Memory für Sie eher nicht wichtig sein. Der wichtigste Wert für Sie sollte also die USS sein.

    
bwoebi 01.08.2016, 20:54
quelle
6

memory_get_usage meldet den von einem PHP-Prozess zugewiesenen Speicher, um das Skript auszuführen. ps meldet den Speicher, der vom PHP-Prozess selbst verwendet wird, einschließlich des für Ihr Skript verwendeten Speichers. PHP-Prozess verwendet viele externe Bibliotheken, die alle ihren Speicher zuordnen können, ohne dass der PHP-Prozess dies bemerkt.

Also memory_get_usage und ps messen von Natur aus verschiedene Dinge und sollten unterschiedliche Zahlen melden. Es kommt darauf an, wie Sie "tatsächliche Speichernutzung" definieren. Ich verstehe, dass Sie in Ihrem Fall mehr an der Speichernutzung des PHP-Prozesses interessiert sind. Dann ist die Ausgabe von ps für Sie relevanter. Aber man kann leicht feststellen, dass selbst der von ps gemeldete RSS-Wert in der Welt moderner Betriebssysteme und Shared Memories nicht so schwarz-weiß ist.

Siehe auch:

Erki A 01.08.2016 09:07
quelle
2

Sie können interessante Dinge finden, wenn Sie einen dieser Befehle ausgeben:

%Vor%     
IVO GELOV 01.08.2016 09:20
quelle

Tags und Links