php进程的内存使用情况

fic*_*ion 12 php linux memory

摘要


简短的推荐(来自更多数据信息,请参阅答案)

为避免内存泄漏,您可以:

  1. 当它们变得无用时立即取消变量
  2. 您可以使用xdebug通过函数详细报告内存消耗并查找内存泄漏
  3. 你可以设置memory_limit(例如5Mb)以避免虚拟内存分配

什么php可以使用内存,除了库和变量?我使用以下代码监视变量及其~3Mb使用的内存:

$vars = array_keys(get_defined_vars());
        $cnt_vars = count($vars);
        $allsize = 0;
        for ($j = 0; $j < $cnt_vars; $j++) {

            try
            {
                $size = @serialize($$vars[$j]);
                $size = strlen($size);
            }
            catch(Exception $e){
                $str = json_encode($$vars[$j]);
                $str = str_replace(array('{"','"}','":"','":'), '', $str);
                $size = strlen($str);
            }
            $vars[$j] = array(
                'size' => $size,
                'name' => $vars[$j]
            );
            $allsize += $size;
        }
Run Code Online (Sandbox Code Playgroud)

和库需要大约18Mb(libcurl等)所以总共21Mb,但是

pmap -x(进程)显示,总内存消耗为kB:314028 RSS:74704 Dirty:59672

所以,实际消费总量约为74Mb.另外我在我的pmap中看到一些带有[anon]映射的大块用于PHP使用这个块的什么?

php版本:5.5.9-1ubuntu4.14 php扩展:

root@webdep:~# php -m
[PHP Modules]
bcmath
bz2
calendar
Core
ctype
curl
date
dba
dom
ereg
exif
fileinfo
filter
ftp
gd
gettext
hash
iconv
json
libxml
mbstring
mcrypt
mhash
openssl
pcntl
pcre
PDO
pdo_pgsql
pgsql
Phar
posix
readline
Reflection
session
shmop
SimpleXML
soap
sockets
SPL
standard
sysvmsg
sysvsem
sysvshm
tokenizer
wddx
xml
xmlreader
xmlwriter
Zend OPcache
zip
zlib

[Zend Modules]
Zend OPcache
Run Code Online (Sandbox Code Playgroud)

Sma*_*mar 5

注意:这并不完全是答案,而是OP请求的信息,但是注释字段对于这个来说太短了......这些是更多如何调试此类问题的工具。

\n\n

Xdebug\xe2\x80\x99s 文档非常全面,他们应该比我通过将他们的文档复制到这里更好地告诉如何使用它。您提供的脚本有点模糊,所以我自己没有进行跟踪,但它会给您逐行的内存使用情况差异。

\n\n

基本上设置xdebug.show_mem_delta1启用 Xdebug 以生成函数跟踪,然后您可以在文本编辑器中打开该跟踪以查看究竟是哪个部分泄漏了内存。

\n\n

然后,您可以比较初始(或中间位置)总内存,看看它与您看到的实际内存使用情况有多少差异。

\n\n
TRACE START [2007-05-06 14:37:26]\n    0.0003     114112  +114112   -> {main}() ../trace.php:0\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里的总内存是114112.

\n\n

如果差异确实很大,您可能需要使用类似的方法shell_exec()来获取所有行之间的实际内存使用情况,并将其输出,然后您可以将该输出与 Xdebug\xe2\x80\x99s 内存输出进行比较,以查看差异发生。

\n\n

如果差异来自脚本的第一行,则罪魁祸首可能是 PHP 的扩展。看看php -m是否有任何可疑的扩展。

\n


Uda*_*ant 5

PHP与编译为单个二进制文件的C或CPP代码不同.所有脚本都在Zend虚拟机中执行.大多数内存都由VM本身消耗.这包括加载的扩展使用的内存,PHP进程使用的共享库(.so文件)和任何其他共享资源.

我不记得确切的来源,但在某处我读到,PHP内部消耗了近70%的总CPU周期,只有30%的内容被你的代码消耗了(如果我错了,请纠正我).这与内存消耗没有直接关系,但应该了解PHP的工作原理.

关于anon块我在另一个SO答案中找到了一些细节.答案是关于Java的,但同样适用于PHP.

匿名块是通过malloc或mmap分配的"大"块 - 请参阅联机帮助页.因此,它们与Java堆无关(除了整个堆应该存储在这样的块中的事实).

我建议禁用一些扩展.这应该可以节省一些未使用的内存.