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:

  1. Criei uma API simples, somente um GET para fazer a chamada. Uma com .NET CORE 2.2 e outra com o 3.0.
  2. Criei um console para chamar essas APIs e validar o consumo de memória.
  3. Criei duas imagens do docker com as APIs e subi os containers.
  4. Rodei o console com 1.000.000 de chamadas para as APIs no docker.
  5. 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.