Mittelstand Radar : Signaux d'achat du Mittelstand allemand — réservez dès maintenant votre première édition du rapport.Rejoindre la liste d'attente
Illustration isométrique de conteneurs, graphiques de performance et Kubernetes avec des signes dollar représentant des économies de coûts
Retour au blog
.NET.NET 9Performance

DATAS et Server Garbage Collection dans .NET 9

Sven HennessenDéveloppement

.NET 9 apporte de nombreuses optimisations en matière de performance et de gestion des ressources. DATAS et le Server Garbage Collection aident à exécuter des services .NET sur Kubernetes de manière plus économique.

.NET 9 apporte de nombreuses optimisations en matière de performance et de gestion des ressources. L'une des innovations les plus importantes est DATAS, Dynamic adaptation to application sizes, qui est désormais activée par défaut. DATAS améliore la gestion mémoire en adaptant dynamiquement la taille du heap à la charge et aux ressources disponibles.

Qu'est-ce que DATAS ?

DATAS est une optimisation du Garbage Collector introduite comme fonctionnalité optionnelle dans .NET 8 et activée par défaut dans .NET 9.

Contrairement au Server GC classique, optimisé pour le débit maximal, DATAS adapte dynamiquement la taille du heap et les stratégies de GC aux besoins réels de l'application. C'est particulièrement avantageux avec des charges fluctuantes et dans les environnements conteneurisés, car la consommation mémoire peut être pilotée plus efficacement.

Pour plus de détails sur le fonctionnement de DATAS, consultez la documentation officielle.

Mise en place du test

Pour démontrer les améliorations apportées par DATAS, nous avons créé un setup de test avec les composants suivants :

  • Minikube comme cluster Kubernetes local
  • Un service ASP.NET qui alloue de grandes quantités de mémoire
  • OpenTelemetry pour le monitoring
  • Prometheus comme base de données de séries temporelles
  • Grafana pour la visualisation
  • k6 pour des tests de charge automatisés

Le service stocke en mémoire de grandes chaînes de caractères pour chaque objet métier, puis les supprime après un certain temps.

⚠️ Remarque : le service stocke des données personnelles. Il le fait uniquement parce que l'auteur n'a pas trouvé de meilleur exemple, et cela doit rappeler qu'il ne faut JAMAIS FAIRE CELA À LA LÉGÈRE.

Vous trouverez le code source complet ici : GitHub

Installation et setup

# Start Minikube
minikube start --extra-config=kubelet.authentication-token-webhook=false --extra-config=kubelet.authorization-mode=AlwaysAllow

# Deploy monitoring stack
kubectl apply -f kubectl/observability/

# Deploy and test service
make serve_dotnet8  # for .NET 8
# Copy URL and port
k6 run k6/test.js -e MAX_USERS=50 -e BASE_URL=<URL:PORT>
# Wait for test
make serve_dotnet9  # for .NET 9 
# Copy URL and port
k6 run k6/test.js -e MAX_USERS=50 -e BASE_URL=<URL:PORT>

Observations

Dans nos tests, nous avons comparé le comportement sous charge avec k6 et l'avons visualisé avec un dashboard Grafana.

Graphique des allocations mémoire

Des différences nettes entre .NET 8 et .NET 9 apparaissent :

Allocation mémoire

Graphique des allocations mémoire

Le graphique montre que .NET 9 avec DATAS présente une croissance plus contrôlée des allocations. La ligne bleue, .NET Allocations, monte plus progressivement que les paliers abrupts observés avec .NET 8.

Taille du heap

Graphique de la taille du heap

Le comportement du Large Object Heap, LOH, ligne orange, est particulièrement intéressant :

  • .NET 8 montre des hausses plus importantes et en escalier
  • .NET 9 montre une croissance plus progressive
  • L'adaptation à la charge se fait de manière plus dynamique

Temps d'exécution du Garbage Collection

Graphique du temps d'exécution du Garbage Collection

.NET 9 montre :

  • Des pics GC plus fréquents mais plus courts
  • Des collections Gen0 plus régulières, ligne verte
  • Une meilleure répartition globale des pauses GC

Nombre d'objets stockés

Graphique du nombre d'objets stockés

Le nombre d'objets stockés croît de manière similaire dans les deux versions, ce qui confirme la comparabilité des tests.

Conclusion

Les résultats montrent clairement les avantages de DATAS dans .NET 9 :

  1. Utilisation plus efficace de la mémoire pendant les pics de charge
  2. Meilleure adaptation aux charges de travail changeantes
  3. Croissance contrôlée du Large Object Heap

Ces améliorations sont particulièrement pertinentes pour les microservices conteneurisés, car elles conduisent à une meilleure utilisation des ressources, à des performances plus stables et à une baisse des coûts moyens d'exploitation.

Besoin d'aide ?

Vous voulez optimiser vos services .NET sur Kubernetes et améliorer la gestion mémoire avec DATAS et Server GC, mais vous hésitez sur l'implémentation ? Nous pouvons vous aider. Contactez-nous via notre page de contact et nous travaillerons ensemble pour rendre vos workloads conteneurisés plus efficaces.

Avez-vous déjà migré vos workloads Kubernetes vers .NET 9 et constaté des améliorations d'utilisation mémoire avec DATAS activé ? Écrivez-nous, nous serions ravis d'échanger des retours d'expérience.