2016-07-28 69 views
8

我注意到有什么topps报告内存使用了PHP的过程,对比一下过程本身认为使用(与memory_get_usage)其之间完全不同。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 

在我的具体情况,这是一个问题,因为我m运行了不少工人和守护进程。

当我将PHP内存限制设置为例如根据PHP自己的测量结果,每个守护进程都有128 MB的空间,这些进程只有在达到128 MB时才会被杀死。但是,根据ps,到那时为止每个进程将使用大约200 MB。

回答

2

应该强调的究竟是什么值由报告0和memory_get_usage(true)是。

ps -o rss报告实际居民套装大小。依靠这个值是一个很大的缺陷,因为它不包括最终换出的内存。在一般情况下,你想要的USS,在一套独特的尺寸,这基本上是不共享内存(看看smem(8)为)。内核实际上已经为该进程映射了页面的非共享内存数量,即物理地在RAM或交换文件中存在非共享内存。这与您可以获得“真实”内存使用情况相近。 [请参阅/proc/$PID/smaps以获得详细的概述,正如IVO GELOV的答案中所述,您可以在技术上通过解析该虚拟文件来计算您自己的内存。]

关于memory_get_usage(),这将报告由使用PHP内部内存管理器的系统实际分配的堆内存。这意味着,直接使用系统的其他内存管理器(mmap(2)malloc(3))的库不会在这里公开它们的内存使用情况。 [这是一个例子,为什么mysqlnd确实表现出多大的内存使用量,同时的libmysqlclient不 - 。后者使用malloc()国内]

如果您通过true作为第一个参数,即memory_get_usage(true),它返回内存PHP的内存管理器的总量已经从系统要求。这个数字一般是略微的,但不会比memory_get_usage(false)高得多。它也是memory_limit INI设置与之比较的数字。

如果你想看看你可以运行多少工作,请注意PHP除了内核可能共享共享结构(操作码,类信息等)的库内存和opcache外,并不共享太多内存。因此共享内存对你来说应该不重要。对你来说最重要的价值应该是USS。

+0

Thanks @bwoebi。这和Ivo的答案让我们对问题有了充分的了解解决手头的问题。 – Robbert

6

memory_get_usage报告由PHP进程来运行你的脚本分配的内存。 ps报告PHP进程本身使用的内存,其中包括用于脚本的内存。 PHP进程使用许多外部库,这些库都可以分配内存,而不需要PHP进程意识到这一点。

因此memory_get_usageps本质上衡量不同的事情,并应报告不同的数字。这一切都归结为你如何定义“实际的内存使用情况”。我明白你的情况你更关心PHP进程的内存使用情况。那么ps的输出更适合你。但你可以很容易地发现,即使在现代操作系统和共享存储器世界中,ps报告的RSS值也不是那么黑白。

参见:

+0

谢谢Erki。这是一个有益的开始,但是我们仍然错过了@bwoebi能够在他的答案中提供的一些细节。 – Robbert

2

您可能会发现有趣的事情,当这些命令之一:

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

没有解释的一些秘密结果(尽管潜在的教育)可能不是正确的方法。 ; o) – Jakumi

+0

在很多地方可以找到其他信息,例如 –

+0

,但很有可能,但除非您链接到其中一些地方,否则您的答案本身并不能提供任何见解。 – Jakumi