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:
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.
Respuestas:
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.
fuente
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:
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.
fuente