Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article fournit une vue d’ensemble des stratégies et paramètres recommandés pour la conteneurisation d’applications Java. Lorsque vous conteneurisez une application Java, examinez attentivement le temps processeur disponible par le conteneur. Ensuite, tenez compte de la quantité de mémoire disponible, en tenant compte à la fois de la quantité totale de mémoire et de la taille du tas de la machine virtuelle Java (JVM). Dans les environnements conteneurisés, les applications peuvent avoir accès à tous les processeurs et par conséquent être en mesure d’exécuter plusieurs threads en parallèle. Toutefois, il est courant que les conteneurs aient un quota d’unité centrale appliqué qui peut restreindre l’accès aux processeurs.
La machine virtuelle JVM utilise des heuristiques pour déterminer le nombre de « processeurs disponibles » en fonction du quota d’UC, ce qui peut considérablement influencer les performances des applications Java. La mémoire allouée au conteneur lui-même et la taille de la zone de tas pour la JVM sont aussi importantes que les processeurs. Ces facteurs déterminent le comportement du garbage collector (GC) et les performances globales du système.
Conteneuriser une nouvelle application
Lorsque vous conteneurisez une charge de travail Java pour une nouvelle application, tenez compte de deux éléments lors de la réflexion sur la mémoire :
- Mémoire allouée au conteneur lui-même.
- Quantité de mémoire disponible pour le processus Java.
Comprendre l’ergonomie par défaut de JVM
Les applications ont besoin d’un point de départ et d’un paramètre. La machine virtuelle JVM a une ergonomie par défaut avec des valeurs prédéfinies basées sur le nombre de processeurs disponibles et la quantité de mémoire dans le système. La machine virtuelle JVM utilise les valeurs par défaut indiquées dans les tableaux suivants lorsque vous la démarrez sans indicateurs de démarrage ou paramètres spécifiques.
Le tableau suivant présente le GC par défaut pour les ressources disponibles :
| Ressources disponibles | GC par défaut |
|---|---|
| Nombre quelconque de processeurs Jusqu’à 1 791 Mo de mémoire |
SerialGC |
| 2 processeurs ou plus 1 792 Mo ou plus de mémoire |
G1GC |
Le tableau suivant indique la taille maximale par défaut du tas en fonction de la quantité de mémoire disponible dans l’environnement où la machine virtuelle JVM est en cours d’exécution :
| Mémoire disponible | Taille de segment maximale par défaut |
|---|---|
| Jusqu’à 256 Mo | 50 % de la mémoire disponible |
| 256 Mo à 512 Mo | ~127 Mo |
| Plus de 512 Mo | 25 % de la mémoire disponible |
La taille du tas initial par défaut est de 1/64 de mémoire disponible. Ces valeurs sont valides pour OpenJDK 11 et versions ultérieures, et pour la plupart des distributions, notamment Build Microsoft d’OpenJDK, Azul Zulu, Eclipse Temurin, Oracle OpenJDK, etc.
Déterminer la mémoire du conteneur
Choisissez une quantité de mémoire de conteneur qui répond le mieux à votre charge de travail, en fonction des besoins de votre application et de ses modèles d’utilisation distinctifs. Par exemple, si votre application crée des graphiques d’objets volumineux, vous avez probablement besoin de plus de mémoire que nécessaire pour les applications avec de nombreux graphiques d’objets de petite taille.
Conseil / Astuce
Si vous ne savez pas combien de mémoire allouer, un bon point de départ est de 4 Go.
Déterminer la mémoire de tas JVM
Lorsque vous allouez de la mémoire au tas de la JVM, n’oubliez pas que la JVM a besoin de davantage de mémoire que la quantité allouée au tas de la JVM. Ne définissez pas la taille maximale du tas JVM à une valeur égale à la quantité de mémoire allouée au conteneur. Ce paramètre peut entraîner des erreurs de mémoire insuffisante du conteneur (OOM) et des blocages de conteneur.
Conseil / Astuce
Allouer 75 % de la mémoire du conteneur au tas JVM.
Sur OpenJDK 11 et versions ultérieures, définissez la taille du tas JVM de l’une des manières suivantes :
| Descriptif | Drapeau | Exemples |
|---|---|---|
| Valeur fixe | -Xmx |
-Xmx4g |
| Valeur dynamique | -XX:MaxRAMPercentage |
-XX:MaxRAMPercentage=75 |
Taille minimale ou initiale du tas
Si l’environnement garantit une certaine quantité de mémoire réservée à une instance JVM, telle que dans un conteneur, définissez la taille minimale du tas ou la taille initiale du tas sur la même taille que la taille maximale du tas. Ce paramètre indique à la machine virtuelle JVM qu’elle ne doit pas effectuer la tâche de libérer de la mémoire sur le système d’exploitation.
Pour définir une taille minimale de tas, utilisez -Xms pour les montants absolus ou -XX:InitialRAMPercentage pour les pourcentages.
Importante
Malgré ce que le nom suggère, l’indicateur -XX:MinRAMPercentage définit le pourcentage de RAM maximal par défaut pour les systèmes avec jusqu’à 256 Mo de RAM disponible dans le système.
Déterminer le GC à utiliser
Précédemment, vous avez déterminé la quantité de mémoire heap JVM de départ. L’étape suivante consiste à choisir votre GC. La quantité maximale de mémoire de tas JVM que vous avez souvent influence votre choix de GC. Le tableau suivant décrit les caractéristiques de chaque GC.
| Facteurs | SerialGC | ParallelGC | G1GC | ZGC | ShenandoahGC |
|---|---|---|---|---|---|
| Nombre de cœurs | 1 | 2 | 2 | 2 | 2 |
| Multithreaded | Non | Oui | Oui | Oui | Oui |
| Taille du tas Java | <4 Go | <4 Go | >4 Go | >4 Go | >4 Go |
| Suspendre | Oui | Oui | Oui | Oui (<1 ms) | Oui (<10 ms) |
| Traitement | Minimal | Minimal | Modéré | Modéré | Modéré |
| Effet de latence de queue | Élevé | Élevé | Élevé | Bas | Modéré |
| Version du JDK | Tous | Tous | JDK 8+ | JDK 17+ | JDK 11+ |
| Idéal pour | Petits tas monocœur | Segments de mémoire multicœurs ou charges de travail par lots avec n’importe quelle taille de tas | Réactif dans les tas de taille moyenne à grande (interactions requête-réponse/base de données) | Réactif dans les tas de taille moyenne à grande (interactions requête-réponse/base de données) | Réactif dans les tas de taille moyenne à grande (interactions requête-réponse/base de données) |
Conseil / Astuce
Pour la plupart des applications de microservice à usage général, commencez par le GC parallèle.
Déterminer le nombre de cœurs de CPU dont vous avez besoin
Pour tout GC autre que SerialGC, utilisez deux cœurs vCPU ou plus, ou au moins 2000m pour cpu_limit sur Kubernetes. Ne sélectionnez pas moins d’un cœur de processeur virtuel sur des environnements conteneurisés.
Conseil / Astuce
Si vous ne savez pas par combien de cœurs démarrer, un bon choix est deux cœurs vCPU.
Choisir un point de départ
Commencez par deux réplicas ou instances dans des environnements d’orchestration de conteneurs tels que Kubernetes, OpenShift, Azure Spring Apps, Azure Container Apps et Azure App Service. Le tableau suivant récapitule les points de départ recommandés pour la conteneurisation de votre nouvelle application Java.
| Cœurs de processeur virtuel | Mémoire du conteneur | Taille du tas JVM | GC | Répliques |
|---|---|---|---|---|
| 2 | 4 Go | 75 % | ParallelGC | 2 |
Utilisez les paramètres JVM suivants :
-XX:+UseParallelGC -XX:MaxRAMPercentage=75
Conteneuriser une application locale existante
Si votre application s’exécute déjà localement ou sur une machine virtuelle dans le cloud, commencez par la configuration suivante :
- Quantité de mémoire à laquelle l’application a actuellement accès.
- Le même nombre de processeurs ou de cœurs de processeurs virtuels actuellement disponibles pour l’application.
- Les mêmes paramètres JVM que vous utilisez actuellement.
Si la combinaison de cœurs de processeur virtuel ou de mémoire de conteneur n’est pas disponible, choisissez la plus proche, arrondissez les cœurs de processeurs virtuels et la mémoire du conteneur.
Étapes suivantes
Maintenant que vous comprenez les recommandations générales pour la conteneurisation d’applications Java, passez à l’article suivant pour établir une base de référence de conteneurisation :