在 Apache httpd 进程中定位内存泄漏,基于 PHP/Doctrine 的应用程序

Posted

技术标签:

【中文标题】在 Apache httpd 进程中定位内存泄漏,基于 PHP/Doctrine 的应用程序【英文标题】:Locating memory leak in Apache httpd process, PHP/Doctrine-based application 【发布时间】:2011-02-26 11:18:48 【问题描述】:

我有一个使用这些组件的 php 应用程序:

Centos 5.4 上的 Apache 2.2.3-31 PHP 5.2.10 启用远程调试的 Xdebug 2.0.5 APC 3.0.19 Doctrine ORM for PHP 1.2.1 通过 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】:

我的预感是它可能是 APC,因为它在请求之间存储数据,但同时,它会在 httpd 进程中存储数据似乎很奇怪。

这有什么奇怪的?这正是 APC 所做的。但是,内存在所有 httpd 进程之间共享,所以它并不像听起来那么糟糕。详情请见Where does APC store its opcode and user variable cache?。

【讨论】:

以上是关于在 Apache httpd 进程中定位内存泄漏,基于 PHP/Doctrine 的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在 Apache httpd 和模块中搜索内存泄漏

使用ulimit防止Apache内存泄漏

Linux进程内存分析和内存泄漏定位

一个线程内存泄漏问题定位过程

PHP内存泄漏分析定位

PHP内存泄漏分析定位