Olá Devs, esse é o meu primeiro artigo nesse novo desafio de passar conhecimento. Vou buscar escrever sobre os desafios que passo no dia a dia de um desenvolvedor.
Espero que gostem e deixem sua critica ou sugestão nos comentários, será muito importante pra mim.
Hoje vou falar sobre o gerenciamento de memória do .NET CORE 2.2 comparado com o 3.0 utilizando Docker.
Um belo dia no trabalho, recebemos a noticia do pessoal de Ops (infra ou operações, como quiser chamar) informando que nossa API estava consumindo 40GB de memória e crescendo, fazendo com que o Docker caísse a todo instante. De prontidão, peguei o código fonte e validei todas as operações e verifiquei se estava implementado a interface IDisposeble e se estava tudo correto com as chamadas. Para minha surpresa estava tudo ok.
Parti para a segunda avaliação. Abri o Visual Studio, rodei o projeto e analisando o Diagnostics Tools, efetuei 100.000 requisições em um ponto da API. Assim validei o consumo de memória e a atuação do GC (garbage collector, responsável por liberar os recursos de memória não usados) e por incrível que pareça, estava tudo funcionando muito bem. O famoso na minha maquina funciona. 🙂
Após fritar os pensamentos e jurar de pé junto que o problema não estava com nossa API fui atrás de provas para validar problemas com o Docker e o .NET CORE 2.2. Vi que existe algumas Issues no Git Hub com relação a isso e resolvi fazer uma POC (Prova de conceito) para avaliar alguns problemas.
Segue o teste:
- Criei uma API simples, somente um GET para fazer a chamada. Uma com .NET CORE 2.2 e outra com o 3.0.
- Criei um console para chamar essas APIs e validar o consumo de memória.
- Criei duas imagens do docker com as APIs e subi os containers.
- Rodei o console com 1.000.000 de chamadas para as APIs no docker.
- Ao final das requisições o sistema verifica a memória utilizada na API, sendo que busca a memória no container (Process.WorkingSet64) e a memória do Garbage Collection (GC.GetTotalMemory)
Resultado:
Framework | Memoria no sistema (Megas) | Memoria no GC (Megas) |
NET CORE 2.2 | 929 | 687 |
NET CORE 3.0 | 128 | 12 |
Conclusão:
No teste executado o .NET CORE 3.0 foi 7 vezes mais eficiente que o .NET CORE 2.2 no uso da memoria do sistema e 57 vezes melhor no uso do GC.
Esse teste mostra uma melhor eficiência no uso do framework .NET CORE 3.0, porém se trata de um teste simples e não pode ser uma referencia para uso ou não de um framework.
Todo o código fonte encontra – se no meu git hub (https://github.com/danilodumba/docker-memory-net-core)
Obrigado pela leitura e qualquer duvida entre em contato comigo.