Después de 2 días de depuración, me limité a mi reloj de tiempo: el recolector de basura de Python.
Mi aplicación tiene muchos objetos en la memoria. Y funciona bien
El GC realiza las rondas habituales (no he jugado con los umbrales predeterminados de (700, 10, 10)).
De vez en cuando, en medio de una transacción importante, el barrido de la 2ª generación entra en acción y revisa mis ~ 1.5M de generación de 2 objetos.
¡Esto demora 2 segundos! La transacción nominal toma menos de 0.1 segundos.Django Python Garbage Collection aflicciones
Mi pregunta es ¿qué debo hacer?
Puedo desactivar los barridos de generación 2 (estableciendo un umbral muy alto, ¿es esta la manera correcta?) Y el GC es obediente.
¿Cuándo debería activarlos?
Implementamos un servicio web usando Django, y cada solicitud de usuario toma alrededor de 0.1 segundos.
De manera óptima, ejecutaré estos ciclos de GC gen 2 entre las solicitudes de la API de usuario. ¿Pero cómo hago eso?
Mi vista finaliza con return HttpResponse()
, DESPUÉS que me gustaría ejecutar un barrido gen 2 GC.
¿Cómo hago eso? ¿Este enfoque tiene sentido?
¿Puedo marcar el objeto que NUNCA necesita ser recogido como basura para que el GC no los pruebe cada 2º ciclo de gen?
¿Cómo puedo configurar el GC para ejecutar barridos completos cuando el servidor Django está relativamente inactivo?
Python 2.6.6 en múltiples plataformas (Windows/Linux).
"Mi aplicación tiene muchos objetos en la memoria"? ¿Cómo? –
Los contenedores son diccionarios estándar. Los objetos en sí son mis propias instancias de clase (derivadas de un objeto) o tuplas, en las que uno de los elementos es una referencia a dichas instancias de clase (y el resto de los elementos son enteros). –
Dado que los objetos Django Request y Reply son transitorios, ¿cómo se puede mantener algo en la memoria? –