La memoria viene improvvisamente liberata ogni giorno all'incirca alla stessa ora


10

Ho alcune macchine virtuali su Windows Azure che eseguono il nostro sito Web di e-commerce e ultimamente abbiamo iniziato a utilizzare Telegraf, InfluxDb e Grafana per tenere d'occhio queste macchine. Dopo un paio di settimane di raccolta dei dati, ho notato uno strano modello correlato alla metrica Memoria disponibile :

Ogni giorno quasi sempre nello stesso periodo della giornata, ho notato che viene liberata una quantità improvvisa di memoria che, a causa delle mie abilità DevOp molto molto limitate, non riesco a capire cosa sta causando questo.

Ecco un grafico che mostra questo modello:

Modello dispari

La mia domanda è: cosa potrebbe portare a qualcosa del genere? Ho la tentazione di sospettare che sia colpa di una perdita di memoria, ma ... La memoria libera non scende mai al di sotto del 70% e si verifica solo in due macchine virtuali con più traffico!

Dovrei preoccuparmi quando vedo qualcosa del genere?

PS: ho iniziato a raccogliere metriche per i byte Private e Virtual per ciascuno dei servizi Windows in esecuzione e per il processo w3wp ... anche se ho letto che queste metriche non sono molto affidabili per scoprire se hai una perdita di memoria, ma almeno proverò a ottenere una sorta di tendenza e vedere se è correlata al modello mostrato sopra.


2
Stai vedendo un normale Garbage Collector o IMHO per la pulizia della cache. In che lingua è il tuo sito web? (questa potrebbe essere la tua app, il tuo websever e persino il sistema che sta eseguendo una pulizia)
Tensibai,

Era qualcosa che sospettavo anch'io ... È fatto in ASP.NET MVC 4, quindi la teoria della raccolta dei rifiuti ha un senso. Inoltre, in una nota a margine, le metriche che ho raccolto sul processo di w3wp e il servizio di Windows sembrano assolutamente normali.
António Sérgio Simões

Non so quasi nulla in ASP, ma suppongo che ci sia modo di rappresentare graficamente il consumo di memoria e la garbage collection come in Java, questo dovrebbe aiutare a garantire che questa sia la causa principale.
Tensibai,

Risposte:


7

Ho visto lo stesso schema "dente di sega" in altri sistemi, in particolare uno strumento di dati basato su Java. Sulla base della tua descrizione, penso che tu stia guardando .NET Garbage Collection (supponendo che si tratti di un'app .NET) Java e .NET sono entrambi linguaggi e framework gestiti dalla memoria che usano Garbage Collection.

Una perdita di memoria si trova in genere in framework privi di gestione della memoria o in un programma su un framework gestito dalla memoria che sta scavalcando o confondendo il Garbage Collector.

Ha senso il fatto che questi siano i server con il traffico più elevato. Stai vedendo che il framework .NET alloca la memoria secondo necessità, quindi il garbage collector si avvia regolarmente e recupera la memoria inutilizzata usando gli algoritmi garbage collection. A meno che non si stiano monitorando specifici problemi di prestazioni, non penso che questo modello di utilizzo della memoria sia un problema.


È davvero un'app .NET e dalle mie ricerche degli ultimi due giorni ha molto senso ciò che tu e @Tensibai avete scritto.
António Sérgio Simões,

7

Penso di aver scoperto perché questo grafico si presenta così.

Sto anche raccogliendo le metriche per il contatore delle prestazioni totali Applicazioni / errori ASP.NET e ho notato che esattamente nello stesso momento in cui si verifica un aumento di memoria disponibile, la metrica Errori totali si reimposta su 0.

Secondo msdn questo contatore si reimposta su 0 ogni volta che si verifica un riavvio / arresto dell'applicazione.

Questo mi porta a credere che la causa di questo modello di dente di sega disponibile in memoria sia dovuta al riavvio dell'applicazione in corso.

Ecco come appaiono i miei grafici:

Errori Applicazione ASP.NET totale Surge di memoria

AGGIORNARE

Ciò accade perché i byte privati ​​del processo W3WP raggiungono il limite per un riciclo (Abbiamo un limite di byte privati ​​configurato nel pool di app). E osservando da vicino il grafico dei byte privati, possiamo vedere qualcosa di anormale perché l'utilizzo della memoria passa da 650 MB a 3,2 GB e poche ore dopo passa da 3,6 GB a 16,6 GB! Questo è quando si verifica il riciclo.


2
Questa è una spiegazione molto più plausibile. La liberazione improvvisa della memoria avviene quasi esclusivamente con il riavvio del processo. I meccanismi per liberare memoria dai processi in esecuzione non sono mai così nitidi e raramente in realtà liberano la memoria piuttosto che liberare spazio sull'heap preallocato.
Jiri Klouda,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.