El uso de la memoria difiere mucho (y de forma extraña) entre el frontend y el backend

Mi aplicación App Engine está teniendo problemas con la pérdida de memoria. Registro el uso de la memoria en el camino para encontrar el problema.

from google.appengine.api.runtime import memory_usage memory_usage().current() 

La función que excedió el “límite de memoria privada flexible de 128 MB” está dentro de una tarea diferida. Debería comportarse igual cada vez. Lo vuelvo a ejecutar desde la cola de tareas de las consolas (backend) y desde la interfaz a través de get-request. Ambos obtienen la excepción después del sexto registro.

El resultado difiere es una forma en que no puedo envolver mi cabeza:

  1: 40.3515625 2: 50.3515625 3: 59.71875 4: 63.5234375 5: 72.49609375 6: 75.48046875  1: 98.83203125 2: 98.83203125 3: 98.83203125 4: 98.83203125 5: 98.83203125 6: 98.83203125 

Tengo tres problemas con el resultado:

  • Uno frente a dos tercios de la memoria total se asigna al inicio
  • El backend utiliza el doble de memoria (ejecutando la misma función)
  • El uso de la memoria de fondo no aumenta con el tiempo como lo hace la interfaz.

¿Alguien puede dar sentido a esto para mí?

Además del uso de memoria que esperaría en función de la actividad real relacionada con las solicitudes que manejan, las instancias también tienen un desplazamiento de uso de memoria de solicitud cruzada variable, que incluye, por ejemplo:

  • la propia caja de arena del lenguaje (python)
  • las bibliotecas de python adicionales cargadas mientras se manejan las solicitudes anteriores recibidas hasta ahora (por ejemplo, el servidor puede cargar la biblioteca diferida mientras que la frontent podría no)
  • las sobras aún no han sido limpiadas por el recolector de basura (eventualmente deberían desaparecer, pero los picos de actividad ocasionales pueden provocar que se exceda el límite e incluso la muerte (y el reinicio)). vio, por ejemplo,> 150MB para el límite de 128M)

La carga a petición de bibliotecas es un método típico para mejorar el tiempo de inicio de la instancia. Dicha técnica llevará exactamente a lo que puede parecer una pérdida de memoria, pero no significa necesariamente que realmente sea una pérdida de memoria.

También es posible que el 128M simplemente no sea suficiente para una aplicación (¡se sorprendería de lo mucho que realmente se necesita y el 128M no es mucho!), Actualizar el tipo de instancia es la única forma de avanzar. Realmente puede intentarlo ahora y monitorear el uso. 6 solicitudes no son suficientes para establecer un patrón. Si actualiza y ve que el uso de la memoria se está nivelando, es probable que necesite la actualización. Si no se nivela, es probable que tenga una pérdida de memoria.