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:
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.
Respostas:
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.
fonte
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:
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.
fonte