我看到我长时间运行的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
答案 0 :(得分:0)
您可以使用--enable-debug
配置选项自行编译PHP。如果您执行以这种方式编译的php cli脚本,您将获得有关检测到的内存泄漏的详细说明 - 如果有的话。
但是,memory_get_usage()
返回常量值的事实看起来很奇怪。你能把问题减少到一个脚本吗? (或者显示你的脚本?)你可以将它指向某个PHP扩展吗?您使用的是哪个版本的PHP?