我有一个使用这些组件的 PHP 应用程序:
- Centos 5.4 上的 Apache 2.2.3-31
- PHP 5.2.10
- 启用远程调试的 Xdebug 2.0.5
- APC 3.0.19
- PHP 1.2.1 版 Doctrine ORM 通过 APC 使用查询缓存和结果缓存
- MySQL 5.0.77 使用查询缓存
我注意到,当我启动 Apache 时,最终会产生 10 个子进程。随着时间的推移,每个进程占用的内存都会增加,直到每个进程占用的内存接近可用内存的 10%,这会导致服务器运行缓慢,因为它们加起来会占用 100% 的内存。
以下是我的顶级输出的快照:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1471 apache 16 0 626m 201m 18m S 0.0 10.2 1:11.02 httpd
1470 apache 16 0 622m 198m 18m S 0.0 10.1 1:14.49 httpd
1469 apache 16 0 619m 197m 18m S 0.0 10.0 1:11.98 httpd
1462 apache 18 0 622m 197m 18m S 0.0 10.0 1:11.27 httpd
1460 apache 15 0 622m 195m 18m S 0.0 10.0 1:12.73 httpd
1459 apache 16 0 618m 191m 18m S 0.0 9.7 1:13.00 httpd
1461 apache 18 0 616m 190m 18m S 0.0 9.7 1:14.09 httpd
1468 apache 18 0 613m 190m 18m S 0.0 9.7 1:12.67 httpd
7919 apache 18 0 116m 75m 15m S 0.0 3.8 0:19.86 httpd
9486 apache 16 0 97.7m 56m 14m S 0.0 2.9 0:13.51 httpd
我没有长时间运行的脚本(它们最终都会终止,最长的可能持续 2 分钟),并且我假设每个脚本终止后,它使用的内存就会被释放。(也许有人可以纠正我)。
我的直觉是它可能是 APC,因为它在请求之间存储数据,但同时,它将数据存储在 httpd 进程内似乎很奇怪。
我如何才能查明应用程序的哪个部分导致了内存泄漏?
我可以使用什么工具来查看 httpd 进程内部的内存使用情况是如何增长的以及是什么导致了这种情况?
答案1
这里对类似的问题有一个很好的答案: