La memoria se libera abruptamente todos los días aproximadamente a la misma hora

10

Tengo algunas máquinas virtuales en Windows Azure que ejecutan nuestro sitio web de comercio electrónico, y últimamente comenzamos a usar Telegraf, InfluxDb y Grafana para vigilar estas máquinas. Después de un par de semanas de recopilación de datos, noté un patrón extraño relacionado con la métrica Memoria disponible :

Todos los días, casi siempre en el mismo período del día, he notado que se libera una cantidad abrupta de memoria que, debido a mis habilidades muy muy limitadas de DevOp, no puedo entender qué está causando esto.

Aquí hay un cuadro que muestra este patrón:

Patrón extraño

Mi pregunta es: ¿Qué podría conducir a algo como esto? Me siento tentado a sospechar que la culpa es de una fuga de memoria, pero ... ¡La memoria libre nunca cae por debajo del 70% y solo ocurre en dos de las máquinas virtuales con más tráfico!

¿Debería preocuparme cuando veo algo como esto?

PD: Me he planteado recopilar métricas para bytes privados e virtuales para cada uno de los servicios de Windows que ejecutamos y para el proceso w3wp ... aunque he leído que estas métricas no son muy confiables para averiguar si tiene una pérdida de memoria, pero al menos intentaré obtener algún tipo de tendencia y ver si se correlaciona con el patrón que se muestra arriba.

António Sérgio Simões
fuente
2
Estás viendo un recolector de basura habitual o caché limpiando en mi humilde opinión. ¿En qué idioma está hecho su sitio web? (esta podría ser su aplicación, su servidor web e incluso el sistema que está haciendo una limpieza)
Tensibai
Eso era algo que sospechaba también ... Se hace en ASP.NET MVC 4, por lo que la teoría de recolección de basura tiene algún sentido. Además, en una nota al margen, las métricas que he estado recopilando sobre el proceso w3wp y el servicio de Windows se ven absolutamente normales.
António Sérgio Simões
No sé casi nada en ASP, pero supongo que hay una forma de graficar el consumo de memoria y la recolección de basura como en Java, esto debería ayudar a garantizar que esta sea la causa raíz.
Tensibai

Respuestas:

7

He visto este mismo patrón de "diente de sierra" en otros sistemas, en particular una herramienta de datos basada en Java. Según su descripción, creo que está viendo la recolección de basura .NET (suponiendo que esta sea una aplicación .NET). Java y .NET son lenguajes y marcos administrados por memoria que usan recolección de basura.

Una pérdida de memoria generalmente se encuentra en marcos que carecen de administración de memoria, o en un programa en un marco administrado por memoria que anula o confunde al recolector de basura.

El hecho de que estos sean sus servidores de mayor tráfico tiene sentido. Está viendo que .NET Framework asigna memoria según sea necesario, luego el recolector de basura inicia un ciclo regular y recupera la memoria no utilizada utilizando los algoritmos de recolección de basura. A menos que esté rastreando problemas de rendimiento específicos, no creo que este patrón de uso de memoria sea un problema.

Dave Swersky
fuente
De hecho, es una aplicación .NET y, según mi investigación en los últimos días, tiene mucho sentido lo que escribieron usted y @Tensibai.
António Sérgio Simões
7

Creo que he descubierto por qué este gráfico se ve así.

También estoy recopilando métricas para el contador de rendimiento total de aplicaciones / errores de ASP.NET, y he notado que exactamente al mismo tiempo que ocurre un aumento de memoria disponible, la métrica de errores totales se restablece a 0.

De acuerdo con msdn, este contador se restablece a 0 cada vez que se reinicia / apaga una aplicación.

Esto me lleva a creer que la causa de este patrón de diente de sierra de memoria disponible se debe a que se reinicia la aplicación.

Así es como se ven mis gráficos:

Errores total de la aplicación ASP.NET Aumento de memoria

ACTUALIZAR

Esto sucede porque los Bytes privados del proceso W3WP alcanzaron el límite para un reciclaje (Tenemos un límite de bytes privados configurado en el grupo de aplicaciones). Y mirando de cerca el gráfico de Bytes privados, podemos ver que algo anormal está sucediendo porque el uso de la memoria aumenta de 650 MB a 3.2 GB y unas horas más tarde salta de 3.6 GB a 16.6 GB. Esto es cuando ocurre el reciclaje.

António Sérgio Simões
fuente
2
Esta es una explicación mucho más plausible. La liberación repentina de memoria ocurre casi exclusivamente con reinicios de procesos. Los mecanismos para liberar memoria de los procesos en ejecución nunca son tan nítidos y rara vez liberan realmente la memoria en lugar de liberar algo de espacio en el montón preasignado.
Jiri Klouda