我已经注意到,PHP进程的内存使用情况top
或ps
报告与该进程本身认为使用(with memory_get_usage
)的情况之间存在很大差异。
进程实际使用多少内存?
当与我的一个应用程序一起运行以下代码时:
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
那时,每个进程将使用大约200 MB。
应该强调的究竟是什么价值观报道ps
和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。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句