【发布时间】:2015-01-22 20:26:34
【问题描述】:
我看到我长期运行的 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 跟踪=内存 但我看到的只是 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
【问题讨论】:
-
Xdebug 对长时间运行的脚本 afaik 没有很好的支持,但是:stackoverflow.com/questions/17648097/…
-
@MichaelBerkowski,这似乎对确定执行哪些代码非常有帮助,但不一定有助于查看内存使用情况。应该注意的是,我链接到的内存分析器在显示已执行的内容方面也做得很好。
标签: php