2010-06-01 8 views
9

Doctrina-basado Tengo una aplicación PHP usando estos componentes:Localización de pérdida de memoria en proceso httpd Apache, PHP/aplicación

  • Apache 2.2.3-31 en Centos 5.4
  • PHP 5.2.10
  • Xdebug 2.0.5 con depuración remota activar
  • APC 3.0.19
  • Doctrina ORM para PHP 1.2.1 usando consulta el almacenamiento en caché y caché de resultados a través de APC
  • MySQL 5.0.7 7 usando Query Caching

Me di cuenta de que cuando inicio Apache, finalmente termino con 10 procesos hijos. Conforme pasa el tiempo, cada proceso crecerá en la memoria hasta que cada uno se acerque al 10% de la memoria disponible, lo que comienza a ralentizar el servidor, ya que juntos crecen hasta ocupar el 100% de la memoria.

Aquí es una instantánea de mi salida superior:

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 

no tengo guiones de larga duración (todos ellos terminan con el tiempo, siendo el más largo quizás 2 minutos de duración), y estoy trabajando bajo el supuesto de que una vez que termina cada script, la memoria que utiliza se desasigna. (Tal vez alguien me puede corregir eso).

Mi corazonada es que podría ser APC, ya que almacena los datos entre las solicitudes, pero al mismo tiempo, parece extraño que pueda almacenar datos dentro del proceso httpd.

¿Cómo puedo rastrear qué parte de mi aplicación está causando la pérdida de memoria?

¿Qué herramientas puedo usar para ver cómo crece el uso de la memoria dentro del proceso httpd y qué está contribuyendo a ello?

Respuesta

2

Mi corazonada es que podría ser APC, ya que almacena los datos entre las solicitudes, pero al mismo tiempo, parece extraño que pueda almacenar datos dentro del proceso httpd.

¿Qué hay de raro en eso? Eso es exactamente lo que hace APC. Sin embargo, la memoria se comparte entre todos los procesos de httpd, por lo que no es tan mala como suena. Ver Where does APC store its opcode and user variable cache? para más detalles.

Cuestiones relacionadas