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
http://anantgarg.com/2009/03/10/php-xdebug-webgrind-installation/ –
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 ... –
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