Tengo un servidor Twisted bajo carga. Cuando el servidor está bajo carga, el uso de la memoria aumenta y nunca se recupera (incluso cuando no hay más clientes). La próxima vez que entre en alta carga, el uso de la memoria aumenta nuevamente. He aquí una instantánea de la situación en ese momento:Fuga de memoria en Python Twisted: ¿dónde está?
- memoria RSS es de 400 MB (200 MB debería ser con el número máximo habitual de los clientes).
- gc.garbage está vacío, por lo que no hay objetos incobrables.
- El uso de objgraph.py no muestra candidatos obvios para fugas (no hay una diferencia notable entre un proceso normal y saludable y un proceso de filtración).
- Usando , el generador de impulsos muestra unas pocas decenas de MB (solo) utilizadas por los objetos de Python (principalmente dict, list, str y otros contenedores nativos).
Valgrind con leak-check = full enabled no muestra ninguna fuga importante (solo un par de MBs 'definitivamente perdidos') - entonces las extensiones C no son las culpables. La memoria total también no cuadra con el 400MB + muestra por superior:
==23072== HEAP SUMMARY:
==23072== in use at exit: 65,650,760 bytes in 463,153 blocks
==23072== total heap usage: 124,269,475 allocs, 123,806,322 frees, 32,660,215,602 bytes allocated
La única explicación que puedo encontrar es que algunos objetos no son rastreados por el recolector de basura, de manera que no se muestran por objgraph y por pirómetro, pero usan una gran cantidad de RAM.
¿Qué otras herramientas o soluciones tengo? ¿Compilaría el intérprete de Python en la ayuda del modo de depuración, utilizando sys.getobjects?
Otra herramienta para mirar es Heapy. La respuesta en http://stackoverflow.com/questions/1331561/using-heapys-memory-profile-browser-with-twisted-web da un ejemplo de una forma en que podría querer usarla. –
Lo intenté, desafortunadamente Heapy bloquea el proceso cuando intento usarlo. – Tommy
¿Esto sucede solo cuando se usa PyPy o con CPython también? –