¿Cómo puedo encontrar lo que está usando la memoria en un proceso de Python en un sistema de producción?


Answers

¿Podría registrar el tráfico (a través de un registro) en su sitio de producción y luego reproducirlo en su servidor de desarrollo equipado con un depurador de memoria python? (Recomiendo dozer: http://pypi.python.org/pypi/Dozer )

Question

Mi sistema de producción ocasionalmente muestra una pérdida de memoria que no he podido reproducir en un entorno de desarrollo. He utilizado un analizador de memoria Python (específicamente, Heapy) con cierto éxito en el entorno de desarrollo, pero no puede ayudarme con cosas que no puedo reproducir, y soy reacio a instrumentar nuestro sistema de producción con Heapy porque toma un tiempo hacer lo suyo y su interfaz remota con hilos no funciona bien en nuestro servidor.

Lo que creo que quiero es una forma de volcar una instantánea del proceso Python de producción (o al menos gc.get_objects), y luego analizarlo fuera de línea para ver dónde está usando la memoria. ¿Cómo obtengo un volcado de núcleo de un proceso de Python como este? Una vez que tengo uno, ¿cómo hago algo útil con él?




Haga que su programa se vuelva básico , luego clone una instancia del programa en un cuadro suficientemente similar usando gdb . Existen macros especiales para ayudar a depurar programas de python dentro de gdb, pero si puede hacer que su programa sirva simultáneamente un shell remoto , puede continuar la ejecución del programa y consultarlo con python.

Nunca tuve que hacer esto, así que no estoy 100% seguro de que funcionará, pero tal vez los consejos serán útiles.




El módulo gc tiene algunas funciones que pueden ser útiles, como enumerar todos los objetos que el recolector de basura encontró que son inalcanzables pero que no pueden liberar, o una lista de todos los objetos que se están rastreando.

Si sospecha que los objetos pueden tener fugas, el módulo weakref podría ser útil para averiguar si / cuando se recogen los objetos.