Memória sendo liberada abruptamente todos os dias aproximadamente na mesma hora

10

Eu tenho algumas VMs no Windows Azure que executam nosso site de comércio eletrônico e, recentemente, começamos a usar Telegraf, InfluxDb e Grafana para ficar de olho nessas máquinas. Após algumas semanas de coleta de dados, notei um padrão estranho relacionado à métrica Memória disponível :

Todos os dias quase sempre no mesmo período do dia, tenho notado que há uma quantidade abrupta de memória sendo liberada que, devido às minhas habilidades muito limitadas de DevOp, não consigo descobrir o que está causando isso.

Aqui está um gráfico que mostra esse padrão:

Padrão ímpar

Minha pergunta é: O que poderia levar a algo assim? Sinto-me tentado a suspeitar que um vazamento de memória é o culpado, mas ... A memória livre nunca cai abaixo de 70% e só acontece em duas das VMs com mais tráfego!

Devo me preocupar quando vejo algo assim?

PS: Comecei a coletar métricas para bytes privados e virtuais para cada um dos serviços do Windows em execução e para o processo w3wp ... embora tenha lido que essas métricas não são muito confiáveis ​​para descobrir se há um vazamento de memória, mas pelo menos tentarei obter algum tipo de tendência e ver se ela se correlaciona com o padrão mostrado acima.

António Sérgio Simões
fonte
2
Você está vendo um IMHO comum de coletor de lixo ou limpeza de cache. Em qual idioma o seu site foi criado? (esta poderia ser a sua aplicação, o seu websever, e até mesmo o sistema de fazer alguma limpeza)
Tensibai
Isso também era algo que eu suspeitava ... Isso é feito no ASP.NET MVC 4, então a teoria da coleta de lixo faz algum sentido. Além disso, em uma nota lateral, as métricas que eu tenho reunido no processo w3wp e no serviço do Windows parecem absolutamente normais.
António Sérgio Simões
Não sei quase nada no ASP, mas presumo que haja uma maneira de representar graficamente o consumo de memória e a coleta de lixo como em java, isso deve ajudar a garantir que essa seja a causa raiz.
Tensibai

Respostas:

7

Eu já vi esse mesmo padrão "dente de serra" em outros sistemas, em particular uma ferramenta de dados baseada em Java. Com base na sua descrição, acho que você está observando a coleta de lixo do .NET (supondo que este seja um aplicativo .NET). Java e .NET são linguagens e estruturas gerenciadas por memória que usam a coleta de lixo.

Um vazamento de memória geralmente é encontrado em estruturas que não possuem gerenciamento de memória ou em um programa em uma estrutura gerenciada por memória que está substituindo ou confundindo o coletor de lixo.

O fato de serem esses servidores de maior tráfego faz sentido. Você está vendo a estrutura do .NET alocar memória conforme necessário e, em seguida, o coletor de lixo inicia um ciclo regular e recupera a memória não utilizada usando os algoritmos de coleta de lixo. A menos que você esteja acompanhando problemas específicos de desempenho, não acho que esse padrão de uso de memória seja um problema.

Dave Swersky
fonte
Na verdade, é um aplicativo .NET e, de minha pesquisa nos últimos dias, faz muito sentido o que você e o @Tensibai escreveram.
António Sérgio Simões
7

Acho que descobri por que esse gráfico se parece com isso.

Também estou reunindo métricas para o contador de desempenho total de aplicativos / erros do ASP.NET e notei que, exatamente ao mesmo tempo em que ocorre um aumento de memória disponível, a métrica Total de erros é redefinida para 0.

De acordo com o msdn, esse contador é redefinido para 0 sempre que uma reinicialização / desligamento do aplicativo acontece.

Isso me leva a acreditar que a causa desse padrão de dente de serra com memória disponível se deve ao reinício do aplicativo.

Veja como meus gráficos se parecem:

Total de erros do aplicativo ASP.NET Surto de memória

ATUALIZAR

Isso acontece porque os bytes privados do processo W3WP atingem o limite de reciclagem (temos um limite de bytes privados configurado no pool de aplicativos). Olhando atentamente para o gráfico Private Bytes, podemos ver algo anormal acontecendo, porque o uso da memória passa de 650 MB para 3,2 GB e, algumas horas depois, de 3,6 GB para 16,6 GB! É quando a reciclagem acontece.

António Sérgio Simões
fonte
2
Esta é uma explicação muito mais plausível. A liberação repentina de memória acontece quase exclusivamente com as reinicializações do processo. Os mecanismos para liberar memória dos processos em execução nunca são tão nítidos e raramente liberam a memória, em vez de liberar algum espaço no heap pré-alocado.
Jiri Klouda 15/05