2016-07-28 15 views
8

Ich habe festgestellt, es gibt einen großen Unterschied zwischen dem top oder ps Berichte als Speicherverbrauch für einen PHP-Prozess, im Vergleich zu dem, was der Prozess selbst denkt (memory_get_usage).Wie viel Speicher verwendet PHP tatsächlich?

Wie viel Speicher wird tatsächlich verwendet?

Wenn Sie den folgenden Code zusammen mit einem meines apps:

echo "Memory usage: " . pretty_bytes(memory_get_usage()) . PHP_EOL; 
echo "Peak memory usage: " . pretty_bytes(memory_get_peak_usage()) . PHP_EOL; 
echo "'Actual' memory usage: " . pretty_bytes(memory_get_usage(true)) . PHP_EOL; 
echo "'Actual' peak memory usage: " . pretty_bytes(memory_get_peak_usage(true)) . PHP_EOL; 

$ps_output = exec("ps --pid " . getmypid() . " --no-headers -o rss"); 

echo "'Memory usage according to ps: " . pretty_bytes(intval($ps_output) * 1000); 

Der Ausgang an einer beliebigen Stelle war:

Memory usage: 4.77 MB 
Peak memory usage: 4.99 MB 
'Actual' memory usage: 5.00 MB 
'Actual' peak memory usage: 5.00 MB 
Memory usage according to ps: 17.66 MB 

In meinem speziellen Fall, das ist ein Problem, weil ich Ich betreibe einige Arbeiter und Dämonen.

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. Gemäß der ps werden die Prozesse zu dieser Zeit jeweils etwa 200 MB verwenden.

Antwort

2

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

ps -o rss berichtet die tatsächliche Resident Set Größe. Sich auf diesen Wert zu verlassen, ist eine ziemliche Falle, da er eventuell nicht ausgelagerten Speicher umfasst. In der Regel möchten Sie die USS, die Unique Set Größe, die im Grunde nicht freigegebenen Speicher ist (sehen Sie sich smem(8) dafür). 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, technisch zählen können, indem Sie diese virtuelle Datei analysieren.]

In Bezug auf memory_get_usage() meldet dies den Heapspeicher, 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 Speicherbelegung hier nicht offen legen. [Das ist zum Beispiel, warum mysqlnd Nutzung Speicher Memory zeigen, während libmysqlclient nicht -. Letztere nutzt malloc() intern]

Wenn Sie true als ersten Parameter übergeben, dh memory_get_usage(true), gibt es die Gesamtmenge der internen Speichermanager Speicher PHP hat vom System verlangt. Diese Zahl ist im Allgemeinen geringfügig, aber nicht viel höher als memory_get_usage(false). Es ist auch die Nummer, mit der die memory_limit INI-Einstellung 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 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.

+0

Danke @bwoebi Diese und Ivo's Antwort haben uns einen ausreichenden Einblick in das Problem gegeben um das Problem zu lösen. – Robbert

6

memory_get_usage meldet den Speicher, der von einem PHP-Prozess zugewiesen wurde, um das Skript auszuführen. ps meldet den vom PHP-Prozess selbst verwendeten Speicher, der den für Ihr Skript verwendeten Speicher enthält. PHP-Prozess verwendet viele externe Bibliotheken, die alle ihren Speicher zuordnen können, ohne dass dies dem PHP-Prozess bekannt ist.

So memory_get_usage und ps von Natur aus verschiedene Dinge messen 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 Sie können leicht herausfinden, dass sogar der RSS-Wert, der von ps berichtet wird, nicht so schwarz und weiß in der Welt der modernen Betriebssysteme und geteilten Erinnerungen ist.

Siehe auch:

+0

Danke Erki. Dies war ein hilfreicher Anfang, aber uns fehlten noch einige Details, die @bwoebi in seiner Antwort liefern konnte. – Robbert

2

Sie interessante Dinge finden kann, wenn Ausgabe einen der folgenden Befehle:

cat /proc/PID_NUMBER/smaps 
pmap -d PID_NUMBER 
+0

Einige geheime Ergebnisse ohne Interpretation (obwohl potenziell erziehend) ist wahrscheinlich nicht der richtige Ansatz für SO. ; o) – Jakumi

+0

Zusätzliche Informationen gibt es an vielen Orten wie –

+0

, die sehr gut sein könnten, aber wenn Sie nicht auf einige dieser vielen Orte verlinken, liefert Ihre Antwort selbst keine Einsichten. – Jakumi

Verwandte Themen