13

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?

+0

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. –

+0

Lo intenté, desafortunadamente Heapy bloquea el proceso cuando intento usarlo. – Tommy

+0

¿Esto sucede solo cuando se usa PyPy o con CPython también? –

Respuesta

2

Si el código solo tiene fugas bajo carga (¿lo verificaste?), Echaría un vistazo a todos los lugares donde los mensajes están almacenados en el búfer. ¿El uso de la memoria del proceso en sí mismo aumenta? ¿O aumenta el uso de memoria del sistema? Si es el último caso, su servidor podría ser demasiado lento para mantenerse al día con los mensajes entrantes y el búfer del sistema operativo se llenará ..

+0

no, el problema es con el uso de la memoria del proceso en sí. Y sí, parece estar relacionado con problemas de carga, ya que un proceso puede continuar durante días sin aumento de memoria. – Tommy