.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.
Des différences nettes entre .NET 8 et .NET 9 apparaissent :
Allocation 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
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
.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
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 :
- Utilisation plus efficace de la mémoire pendant les pics de charge
- Meilleure adaptation aux charges de travail changeantes
- 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.




