2011-02-15 7 views
6

Tengo una aplicación PHP desarrollada en Codeigniter 1.7.2, actualmente en producción y en vivo, que parece tener una fuga de memoria grave.Pérdida de memoria en mi aplicación PHP (construida con Codeigniter Framework)

La pérdida de memoria se desprende de mirar "top" en el servidor:

top - 23:42:13 up 26 days, 10:14, 1 user, load average: 0.00, 0.00, 0.00 
Tasks: 54 total, 1 running, 53 sleeping, 0 stopped, 0 zombie 
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 7872040k total, 929748k used, 6942292k free, 142464k buffers 
Swap:  0k total,  0k used,  0k free, 214420k cached 
PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
22740 apache 15 0 308m 63m 5976 S 0 0.8 0:14.05 httpd 

22733 apache 15 0 298m 54m 5968 S 0 0.7 0:13.60 httpd 

22736 apache 15 0 296m 52m 5968 S 0 0.7 0:13.89 httpd 

22742 apache 15 0 295m 50m 5976 S 0 0.7 0:13.05 httpd 

22738 apache 15 0 294m 49m 5968 S 0 0.6 0:13.30 httpd 

22744 apache 15 0 293m 48m 5968 S 0 0.6 0:13.11 httpd 

Así httpd está utilizando 0,8% 7.9GB * de memoria o 63MB aprox.

Sé que CI plus mi aplicación tiene una huella de aproximadamente 7MB. Sé que httpd probablemente tiene algunos pero no puede explicar 63MB, además este número aumenta diariamente si reinicio. Por lo tanto, llegué a la conclusión de que había una pérdida de memoria.

Según mi comprensión de PHP 5.2.x, no hace bastante "recolección de basura" pero liberará memoria al salir de la función y finalmente en la terminación del script. Además, sé de algunos constructos conocidos que pueden provocar una pérdida de memoria ("destrucción de objetos secundarios" y referencias de objetos recursivos), pero no estoy haciendo nada que me guste. Así que estoy un poco perplejo sobre cuál podría ser el problema.

Voy a tratar de rastrearlo usando XDebug, pero tengo algunos problemas para instalarlo en Fedora 8. Si alguien puede señalar algunos "sospechosos habituales" de fugas de memoria en PHP 5.2.x, y/o en Code Igniter ... Espero poder tener suerte y encontrar al culpable si sé qué buscar (busqué problemas conocidos en CI pero no pistolas). Desactivé una función que persistieron las consultas entre funciones y eso ayudó a reducir la huella, pero todavía parece estar goteando).

[[email protected] ~]# php --version 
PHP 5.2.6 (cli) (built: May 8 2008 08:54:23) 
    Copyright (c) 1997-2008 The PHP Group 
    Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies 

[[email protected] ~]# cat /proc/version 
    Linux version 2.6.21.7-2.fc8xen ([email protected]) (gcc version 4.1.2 20070925 (Red Hat 4.1.2-33)) #1 SMP Fri Feb 15 12:34:28 EST 2008 
+2

http://anantgarg.com/2009/03/10/php-xdebug-webgrind-installation/ –

+1

Probablemente vale la pena que pasar por el [5 de cambios PHP] (http://php.net /ChangeLog-5.php) y ver si alguna de las muchas pérdidas de memoria arregladas desde 5.2.6 timbre con tu código ... –

+2

Solo un par de cosas. Uno, la columna RES muestra la cantidad de memoria utilizada, por lo que no tiene que calcularla a partir del porcentaje^_ ^. La columna VIRT es aún más horrible, cada proceso tiene asignados unos 300 MB. En segundo lugar, solo para asegurarse de que no está buscando en el lugar equivocado, ha ejecutado el servidor (o uno configurado de la misma manera) sin la aplicación php ofensiva para confirmar que la filtración no existe, ¿correcto? – jswolf19

Respuesta

2

¿Ha intentado convertir perfiles en la controladora:

$this->output->enable_profiler(TRUE); 

Sería interesante ver si algo surge en los resultados de lo que muestra algo está tomando un poco más de lo habitual.

Además, siempre se puede probar CodeIgniter 2, que ahora se ha lanzado, la actualización es compatible con versiones anteriores y tiene muchas correcciones.

--edit También podría intentar esto: me encontré con una variable “var $ save_queries = true;” en la línea 51 en el archivo /system/database/DB_driver.php

cambia este a FALSO resuelto el problema para mi

Desde su controlador puede usar: $ this-> db-> save_queries = FALSE; Donde la fuga debería ser un problema. --edit

+0

Útil en mis controladores. Sin embargo, el sitio está usando mucho AJAX, enable_profiler() no funciona allí ya que muestra los resultados (no vio una forma de volcar a un archivo de registro u otro método). Gracias, aunque esta es una buena herramienta para saber. – PeterG

Cuestiones relacionadas