La mémoire est brusquement libérée chaque jour à peu près à la même heure

10

J'ai quelques machines virtuelles sur Windows Azure qui exécutent notre site Web de commerce électronique, et dernièrement, nous avons commencé à utiliser Telegraf, InfluxDb et Grafana pour garder un œil sur ces machines. Après quelques semaines de collecte de données, j'ai remarqué un motif étrange lié à la métrique de mémoire disponible :

Tous les jours presque toujours à la même période de la journée, j'ai remarqué qu'il y avait une quantité abrupte de mémoire libérée qui, en raison de mes compétences DevOp très très très limitées, je ne peux pas comprendre ce qui est à l'origine de cela.

Voici un graphique qui montre ce modèle:

Motif étrange

Ma question est: qu'est-ce qui pourrait conduire à quelque chose comme ça? Je me sens tenté de soupçonner qu'une fuite de mémoire est à blâmer, mais ... La mémoire libre ne descend jamais en dessous de 70% et ne se produit que dans deux des machines virtuelles avec le plus de trafic!

Dois-je m'inquiéter quand je vois quelque chose comme ça?

PS: J'ai commencé à rassembler des métriques pour les octets privés et virtuels pour chacun des services Windows que nous avons en cours d'exécution et pour le processus w3wp ... bien que j'ai lu que ces métriques ne sont pas très fiables pour savoir si vous avez une fuite de mémoire, mais au moins je vais essayer d'obtenir une sorte de tendance et voir si elle est en corrélation avec le schéma ci-dessus.

António Sérgio Simões
la source
2
Vous voyez un ramasse-miettes ou un nettoyage de cache habituel à mon humble avis. Dans quelle langue votre site Internet est-il réalisé? (cela pourrait être votre application, votre websever et même le système effectuant un nettoyage)
Tensibai
C'était quelque chose que je soupçonnais aussi ... C'est fait dans ASP.NET MVC 4, donc la théorie de la collecte des ordures a un certain sens. En outre, sur une note secondaire, les mesures que j'ai rassemblées sur le processus w3wp et le service Windows semblent absolument normales.
António Sérgio Simões
Je ne sais presque rien dans ASP, mais je suppose qu'il existe un moyen de représenter graphiquement la consommation de mémoire et la récupération de place comme en Java, cela devrait aider à garantir que c'est la cause première.
Tensibai

Réponses:

7

J'ai vu ce même modèle "en dents de scie" dans d'autres systèmes, en particulier un outil de données basé sur Java. Sur la base de votre description, je pense que vous examinez le garbage collection .NET (en supposant qu'il s'agit d'une application .NET.) Java et .NET sont tous deux des langages et des cadres gérés par la mémoire qui utilisent le garbage collection.

Une fuite de mémoire se trouve généralement dans les cadres qui manquent de gestion de la mémoire, ou dans un programme sur un cadre géré par la mémoire qui remplace ou déroute le garbage collector.

Le fait que ce soient vos serveurs les plus fréquentés est logique. Vous voyez le framework .NET allouer de la mémoire selon les besoins, puis le garbage collector entre en action sur un cycle régulier et récupère la mémoire inutilisée à l'aide des algorithmes de collecte de déchets. À moins que vous ne suiviez des problèmes de performances spécifiques, je ne pense pas que ce modèle d'utilisation de la mémoire soit un problème.

Dave Swersky
la source
Il s'agit en effet d'une application .NET et d'après mes recherches des derniers jours, cela a beaucoup de sens ce que vous et @Tensibai avez écrit.
António Sérgio Simões
7

Je pense avoir découvert pourquoi ce graphique ressemble à ceci.

Je collecte également des métriques pour le compteur de performances totales Applications / Erreurs ASP.NET, et j'ai remarqué qu'exactement en même temps qu'une surtension de mémoire disponible se produit, la métrique Total Errors se remet à 0.

Selon msdn, ce compteur est réinitialisé à 0 chaque fois qu'un redémarrage / arrêt d'application se produit.

Cela m'amène à croire que la cause de ce motif en dents de scie disponible en mémoire est due au redémarrage de l'application.

Voici à quoi ressemblent mes graphiques:

Erreurs Total ASP.NET Application Surtension de mémoire

METTRE À JOUR

Cela se produit car les octets privés du processus W3WP ont atteint la limite pour un recyclage (nous avons une limite d'octets privés configurée dans le pool d'applications). Et en regardant de près le graphique des octets privés, nous pouvons voir que quelque chose d'anormal se produit parce que l'utilisation de la mémoire passe de 650 Mo à 3,2 Go et quelques heures plus tard de 3,6 Go à 16,6 Go! C'est à ce moment que le recyclage a lieu.

António Sérgio Simões
la source
2
C'est une explication beaucoup plus plausible. La libération soudaine de mémoire se produit presque exclusivement avec les redémarrages du processus. Les mécanismes pour libérer la mémoire des processus en cours d'exécution ne sont jamais aussi précis et libèrent rarement la mémoire plutôt que de libérer de l'espace sur le tas préalloué.
Jiri Klouda