memory_get_usage似乎不准确,如何进一步诊断PHP中的内存泄漏?

时间:2015-01-22 20:26:34

标签: php

我看到我长时间运行的php进程占用了大量内存,并且它的增长速度非常快。大约一天后,我看到了以下内容:

# pmap <pid>  

000000000091c000    588K rw---  /usr/bin/php  
00000000009af000    108K rw---    [ anon ]  
00000000013ab000 256948K rw---    [ anon ]  
00007f9ed0000000    132K rw---    [ anon ]  
...  
00007f9edcaa6000      8K rw---  /usr/lib64/php/modules/curl.so  
00007f9edcaa8000 103580K r----  /usr/lib/locale/locale-archive  
...  
 total           629312K  

# cat /proc/<pid>/status  


Name:   php  
State:  S (sleeping)  
...  
VmHWM:    268920 kB  
VmRSS:    268920 kB  
VmData:   334368 kB  
VmStk:       136 kB  
VmExe:      3188 kB  
VmLib:     22752 kB  
VmPTE:       912 kB  
VmSwap:        0 kB  
Threads:    1  
...  
Mems_allowed:   00000000,00000001  
Mems_allowed_list:  0  
voluntary_ctxt_switches:    11902137



ps aux  


0.5  4.3 694124 333864 ?       S    Jan21   8:11 php  

top  

PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  CODE DATA COMMAND  
20   0  677m 326m 9100 S  0.0  4.4   8:11.56 3188 390m php  

但是,memory_get_usage(true)始终如一地返回:
    1835008

似乎存在内存泄漏,但我如何诊断原因并减少它?我尝试使用this之类的工具,但与memory_get_usage类似,它没有注意到任何额外的内存使用情况

我也尝试过:     #strace -p -e trace = memory 但我所看到的都是brk()调用,如下所示:

brk(0)                                  = 0x14f6f000
brk(0x14f90000)                         = 0x14f90000

我的版本是5.4.27:

# php --version
PHP 5.4.27 (cli) (built: Apr 23 2014 23:34:13)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies

1 个答案:

答案 0 :(得分:0)

您可以使用--enable-debug配置选项自行编译PHP。如果您执行以这种方式编译的php cli脚本,您将获得有关检测到的内存泄漏的详细说明 - 如果有的话。

但是,memory_get_usage()返回常量值的事实看起来很奇怪。你能把问题减少到一个脚本吗? (或者显示你的脚本?)你可以将它指向某个PHP扩展吗?您使用的是哪个版本的PHP?