简体   繁体   English

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

[英]Locating memory leak in Apache httpd process, PHP/Doctrine-based application

I have a PHP application using these components: 我有一个使用这些组件的PHP应用程序:

  • Apache 2.2.3-31 on Centos 5.4 Centos 5.4上的Apache 2.2.3-31
  • PHP 5.2.10 PHP 5.2.10
  • Xdebug 2.0.5 with Remote Debugging enabled Xdebug 2.0.5启用了远程调试
  • APC 3.0.19 APC 3.0.19
  • Doctrine ORM for PHP 1.2.1 using Query Caching and Results Caching via APC PHP 1.2.1的Doctrine ORM使用查询缓存和通过APC的结果缓存
  • MySQL 5.0.77 using Query Caching MySQL 5.0.77使用查询缓存

I've noticed that when I start up Apache, I eventually end up 10 child processes. 我注意到,当我启动Apache时,我最终得到了10个子进程。 As time goes on, each process will grow in memory until each one approaches 10% of available memory, which begins to slow the server to a crawl since together they grow to take up 100% of memory. 随着时间的推移,每个进程将在内存中增长,直到每个进程接近10%的可用内存,这开始使服务器慢慢爬行,因为它们一起增长占用了100%的内存。

Here is a snapshot of my top output: 这是我的最高输出的快照:

 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 

I have no long-running scripts (they all terminate eventually, the longest being maybe 2 minutes long), and I am working under the assumption that once each script terminates, the memory it uses gets deallocated. 我没有长时间运行的脚本(它们最终终止,最长的可能是2分钟),我的工作假设是每个脚本终止后,它使用的内存将被释放。 (Maybe someone can correct me on that). (也许有人可以纠正我)。

My hunch is that it could be APC, since it stores data between requests, but at the same time, it seems weird that it would store data inside the httpd process. 我的预感是它可能是APC,因为它在请求之间存储数据,但同时,它会将数据存储在httpd进程中似乎很奇怪。

How can I track down which part of my app is causing the memory leak? 如何跟踪我的应用程序的哪个部分导致内存泄漏?

What tools can I use to see how the memory usage is growing inside the httpd process and what is contributing to it? 我可以使用哪些工具来了解httpd进程内存使用量的增长情况以及有何贡献?

My hunch is that it could be APC, since it stores data between requests, but at the same time, it seems weird that it would store data inside the httpd process. 我的预感是它可能是APC,因为它在请求之间存储数据,但同时,它会将数据存储在httpd进程中似乎很奇怪。

What's weird about that? 这有什么奇怪的? That's exactly what APC does. 这正是APC所做的。 The memory is shared between all httpd processes, though, so it's not as bad as it sounds. 但是,内存在所有httpd进程之间共享,所以它没有听起来那么糟糕。 See Where does APC store its opcode and user variable cache? 请参阅APC在哪里存储其操作码和用户变量缓存? for details. 详情。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM