Recentemente, a Maoni publicou um post explicando em detalhes como o DATAS afeta o comportamento das aplicações. Este texto traz um resumo dos principais pontos abordados por ela.
Para quem quiser ler o post original completo, acesse aqui o link.
A transição para o .NET 10 introduz uma alteração significativa no mecanismo de Coleta de Lixo (GC), com a ativação padrão do DATAS (Dynamic Adaptation to Application Size — Adaptação Dinâmica ao Tamanho da Aplicação) para o Server GC. Embora o .NET 9 já contasse com o DATAS habilitado por padrão, a migração para a versão LTS (.NET 10) representa o primeiro contato de muitos usuários com este recurso.
Diferentemente da maioria das otimizações do GC, que são transparentes e automáticas, o DATAS exige atenção do usuário, o que justifica a necessidade de uma fase de preparação e análise. As mudanças no perfil de desempenho da aplicação podem ser notáveis, principalmente na utilização da memória, que tende a ser significativamente reduzida.
É importante que os usuários avaliem as métricas de desempenho de suas aplicações para determinar se esta compensação se alinha aos seus objetivos de otimização.
1. O Paradigma do DATAS em Comparação ao Server GC Tradicional
A principal distinção do DATAS reside na sua política fundamental: a adaptação ao tamanho da aplicação. O Server GC tradicional nunca teve como objetivo adaptar-se ao tamanho da aplicação, baseando suas decisões primariamente na taxa de sobrevivência das gerações e no número de cores (núcleos) que o processo pode utilizar. Em consequência, o tamanho do heap em um Server GC não adaptativo pode variar drasticamente dependendo da máquina em que é executado.
O DATAS resolve essa variabilidade ao adaptar-se ao LDS (Live Data Size - Tamanho dos Dados Vivos), resultando em tamanhos de heap similares, mesmo que o número de cores varie substancialmente.
1.1 Objetivos Primários do DATAS
O DATAS foi concebido para atender a dois tipos específicos de cenários:
- Cargas de Trabalho Intermitentes (Bursty Workloads) em Ambientes com Restrição de Memória: Aplicativos que processam um volume variável de requisições, com picos e vales de demanda. O DATAS retrai o tamanho do heap quando a carga de trabalho diminui e o expande quando a demanda aumenta. Este comportamento é particularmente valioso em contêineres com limites de memória estabelecidos. Em ambientes orquestrados (como k8s), o DATAS aumenta a robustez do gerenciamento, auxiliando na definição de limites de memória mais previsíveis, o que potencializa o uso de HPA (Horizontal Pod Autoscaler).
- Cargas de Trabalho de Pequeno Porte Utilizando Server GC: Para aplicações menores, como um pequeno serviço asp.net core, o DATAS garante que o tamanho do heap esteja mais alinhado com as necessidades reais de memória da aplicação.
1.2 O Mecanismo de Adaptação
A adaptabilidade é alcançada através de dois componentes-chave:
- Budget Computed via DATAS (BCD): Este conceito introduz um limite superior para o orçamento da Geração 0 (Gen0), calculado em função do tamanho da aplicação (LDS).
- Manutenção do Throughput: Dentro desse limite superior, a memória é reduzida, desde que seja mantido um nível de desempenho aceitável, definido pelo Target Throughput Cost Percentage (TCP). O TCP padrão é de 2%. Se a carga de trabalho diminuir (e, consequentemente, o custo de throughput cair abaixo do TCP), o DATAS reduzirá o orçamento da Gen0, o que resulta em GCs mais frequentes, mas em um tamanho de heap geral menor, adaptando-se à demanda.
Em termos simples, o TCP indica quanto tempo o GC fica em pausa quando o sistema está em estado estável.
1.3 Implicações para o Workstation GC
Para aqueles desenvolvedores que utilizavam o Workstation GC unicamente para restringir o consumo de memória, devido ao uso excessivo pelo Server GC, podem considerar o DATAS uma alternativa superior. O DATAS possibilita tanto a limitação do uso de memória quanto a redução das pausas do GC, aproveitando múltiplas threads para a coleta (característica do Server GC).
2. Cenários em que o recurso não se aplica e pode causar perda de desempenho
Embora o DATAS otimize a utilização de memória, ele geralmente implica uma ligeira regressão no *throughput* em comparação com o Server GC não adaptativo. É crucial analisar métricas de desempenho para validar a implementação.
O DATAS não é recomendado nos seguintes cenários, a menos que haja tuning específico:
- Sem Benefício no Uso de Memória Liberada: Em aplicações executadas em máquinas dedicadas, onde a memória liberada pelo DATAS não será reutilizada, a mudança de comportamento pode não trazer vantagens reais.
- Impacto no Desempenho de Inicialização (Startup Performance): O DATAS sempre começa com apenas um heap. Como o ajuste inicial prioriza a otimização de tamanho, o crescimento para múltiplos heaps ocorre gradualmente — o que pode causar regressão no desempenho de inicialização.
- Cenários com Alta Exigência de *Throughput*: Em ambientes dedicados que precisam maximizar o throughput nos horários de pico e não toleram quedas de desempenho, o DATAS pode não ser ideal. Nesses casos, pode ser necessário desativá-lo ou ajustar seu tuning de forma mais agressiva.
- Aplicações com Muitas Coletas de Geração 2 (Gen2): Quando a aplicação realiza majoritariamente GCs de Gen2 — geralmente devido à criação excessiva de objetos temporários grandes — e o DATAS apresenta resultados insatisfatórios, recomenda-se desativá-lo.
3. Soluções e Estratégias de Tuning para o DATAS
Se for observada uma diminuição no throughput após a migração, existem configurações específicas para otimizar o DATAS ou desativá-lo.
3.1 Desativação Simples
Para desativar o mecanismo de adaptação dinâmica, utilize a configuração GCDynamicAdaptationMode.
3.2 Otimização Fina (Tuning)
A otimização geralmente envolve ajustar o orçamento da Geração 0 (BCD) para permitir um uso maior de memória entre as coletas, melhorando o throughput.
A análise de desempenho deve focar em traços do GC, comparando o "Gen0 Alloc MB" (orçamento Gen0) e a "% Pause Time" (aproximação do TCP) entre as execuções. Em um caso de cliente, por exemplo, o orçamento de Gen0 sem DATAS era 2.6 vezes maior do que com DATAS, pois este último estava estritamente aderente ao TCP padrão de 2%.
Para ajustar o BCD e aumentar o throughput:
-  Ajuste do Target TCP: Se o throughput for mais importante, o alvo de custo de throughput pode ser reduzido, por exemplo, para 1%, utilizando a configuração GCDTargetTCP.
-  Aumento do Orçamento Gen0: Para que o DATAS utilize um orçamento de Gen0 maior, deve-se aumentar o multiplicador usado no cálculo do BCD:
-   Use GCDGen0GrowthPercentpara aumentar a constante na fórmula do BCD.
-   Se for necessário um aumento muito grande (para garantir que o orçamento não seja limitado pelo valor mínimo), ajuste GCDGen0GrowthMinFactor.
 
-   Use 
3.3 Gerenciamento Dinâmico de Heaps
Anteriormente, alguns desenvolvedores configuravam manualmente o número de heaps (GCHeapCount) no Server GC para restringir o uso de memória. Contudo, especificar GCHeapCount desabilita o DATAS, pois interfere na sua capacidade de adaptar o número de heaps.
A recomendação é remover a configuração GCHeapCount. Ao permitir que o DATAS gerencie a contagem de heaps, a aplicação se beneficia de maior flexibilidade. Em cenários de alta carga, o uso de mais threads de GC resulta em pausas individuais de coleta significativamente menores, e o tamanho total do heap ainda é reduzido quando a carga diminui.
Conclusão
O DATAS é uma evolução robusta do Server GC, tornando-o mais adequado para ambientes modernos de infraestrutura baseada em contêineres e multitenancy. Contudo, a natureza fundamentalmente diferente de sua política de alocação exige validação.
O sucesso da implementação do DATAS no .NET 10 depende da análise cuidadosa dos objetivos de otimização da aplicação. Se a redução de memória é prioridade, o DATAS deve ser mantido. Se a maximização do throughput é o foco absoluto, o tuning fino (via GCDTargetTCP ou GCDGen0GrowthPercent) ou a desativação completa pode ser a solução mais adequada. A execução de testes de desempenho comparativos é essencial para determinar a configuração ideal.
 

 
                       
    
Top comments (0)