2016-07-28 9 views
8

topまたはpsは、プロセス自体が使用すると考えられるもの(memory_get_usage)と比較して、PHPプロセスのメモリ使用量としてかなりの違いがあることに気付きました。PHPは実際にどのくらいのメモリを使用していますか?

プロセスが実際にどのくらいのメモリを使用していますか?

私のアプリケーションの一つと一緒に次のコードを実行している場合:ランダム点で

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); 

出力をした

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 

私の特定のケースでは、私は「ので、これが懸念されます非常に少数の労働者とデーモンを運営しています。

私はPHPのメモリ制限を例えばに設定しました。これらのデーモンごとに128 MBがあると、プロセスはPHPの独自の測定値に従って128 MBに達すると殺されます。しかし、psによれば、プロセスはその時までにそれぞれ約200MBを使用します。

答えて

2

それが強調されるべきであるかを正確にによって報告された値0とmemory_get_usage(true)があります。

ps -o rss実際には住民セットサイズが報告されています。この値に依存することは、最終的にスワップアウトされたメモリを含まないため、かなりの落とし穴です。一般的には、USSユニークセットサイズが必要です。これは基本的に共有されていないメモリです(これについてはsmem(8)をご覧ください)。これは、カーネルが実際にそのプロセスのページをマップした共有されていないメモリの量です。すなわち、RAMまたはスワップファイルに物理的に共有されていないメモリが存在します。これは「実際の」メモリ使用量に近づけることができます。 [IVO GELOVの回答に記載されているように、詳細な概要については、/proc/$PID/smapsも参照してください。ここでは、仮想ファイルを解析することによって、自分が数えたいと思うメモリを技術的に数えることができます。]

memory_get_usage()に関しては、PHPの内部メモリマネージャを使用してシステムによって実際に割り当てられたヒープメモリを報告します。つまり、システムの他のメモリマネージャ(mmap(2)またはmalloc(3))を直接使用するライブラリは、ここではそのメモリ使用量を公開しません。 [mysqlndはlibmysqlclientのはそうではない多くのメモリ使用量を示していなぜこれは、例えばある - 後者は内部malloc()を使用しています。]

あなたが最初のパラメータとしてtrueを渡す場合、すなわちmemory_get_usage(true)、それはメモリPHPの内部メモリマネージャの総量を返しますシステムから求めています。この数字は一般的にわずかですが、それほど高くはないmemory_get_usage(false)です。また、INI設定と比較される数値です。

実行できる作業者の数を確認したい場合は、PHPがメモリを共有していないことに注意してください。ただし、カーネルが構造体(オペコード、クラス情報など)を共有するライブラリメモリとopcacheを共有する場合があります。したがって、共有メモリはあなたにとって重要ではないはずです。したがって、あなたにとって最も重要な価値はUSSでなければなりません。

+0

ありがとう@bwoebiこれとIvoの答えは、問題の十分なレベルの洞察を与えてくれましたすぐに問題に取り組む – Robbert

6

memory_get_usageは、スクリプトを実行するためにPHPプロセスによって割り当てられたメモリをレポートします。 psは、スクリプトに使用されるメモリを含むPHPプロセス自体によって使用されるメモリを報告します。 PHPプロセスは、多くの外部ライブラリを使用します。これらのライブラリはすべて、PHPプロセスがそれを認識することなくメモリを割り当てることができます。

したがってmemory_get_usagepsは本質的に異なるものを測定し、異なる数字を報告する必要があります。 「実際のメモリ使用量」はどのように定義されているのでしょうか?私はあなたのケースでは、PHPプロセスのメモリ使用にもっと興味があることを理解しています。その後、psの出力がより適切です。しかし、psによって報告されたRSS値でさえ、最新のオペレーティングシステムや共有メモリの世界ではそれほど白黒ではないことを簡単に知ることができます。

も参照してください:これらのコマンドのいずれかを発行したときに

+0

ありがとうございます。これは有益なスタートでしたが、@bwoebiが答えで提供できるいくつかの詳細レベルがまだ不足していました。 – Robbert

2

あなたは面白いものを見つけることがあります。

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

(潜在的に教育を行っていますが)解釈のない秘密の結果はおそらく、SOの正しいアプローチではありません。 ; o) – Jakumi

+0

その他の情報は、 –

+0

のような多くの場所で入手できますが、それらの場所のいくつかにリンクしない限り、あなたの答えはそれ自体では何の洞察も提供しません。 – Jakumi

関連する問題