Réglage JVM sur Conteneur (Java 8)
Nous avons récemment déplacé notre pile d'applications vers ECS-EC2 d'EC2 et notre plan est de déplacer la pile ECS-EC2 vers la production. Nous avons été confrontés à un problème dans le réglage de l'application sur ECS-Container. Nous utilisons tomcat avec notre application Web java. Configuration Dockerfile -
FROM tomcat:8.5.40-jre8
COPY checkout.war /usr/local/tomcat/webapps/
COPY server.xml /usr/local/tomcat/conf
COPY context.xml /usr/local/tomcat/conf
COPY catalina.sh /usr/local/tomcat/bin
ENV spring.profiles.active beta
ENV JAVA_OPTS="-Dspring.profiles.active=beta"
RUN echo "export JAVA_OPTS=\"$JAVA_OPTS -Djava.awt.headless=true -server -Xms12G -Xmx12G -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=20 -XX:ConcGCThreads=5 -XX:InitiatingHeapOccupancyPercent=60 -XX:+UseStringDeduplication\"" >> /usr/local/tomcat/bin/setenv.sh
CMD ["sh", "-c", "catalina.sh run"]
Peu de choses sur notre pile d'applications - Nous utilisons r5.type d'instance xlarge ayant 4 services exécutés dans ECS-EC2, et n'ayant pas fourni la limite de mémoire dure à la tâche (Nous avons seulement fourni la mémoire douce à 2 Go à chaque tâche).
Ce que nous avons fait jusqu'à maintenant -
Je suis tombé sur de nombreux articles sur Internet à travers le sujet "Personne ne met java sur le conteneur" Exemple.
Par conséquent, pour l'instant mis à niveau vers tomcat image 8.5.40 qui utilise open jdk "1.8.0_212" (support arrière au conteneur).
Mais après avoir utilisé le Dockerfile ci-dessus, lorsque nous exécutons la commande java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal
à l'intérieur du conteneur, il n'affiche pas les mêmes valeurs pour JVM Tuning (MaxHeap, MinHeap, GC, ParallelGCThreads et autres.) tel que fourni par nous dans le Dockerfile dans la variable JAVA_OPTS.
J'ai essayé une chose similaire dans le conteneur Docker localement mais le même problème se produit.
Comment le réglage JVM sur une application basée sur un conteneur docker est-il possible qui utilise le serveur Tomcat (Java 8)? Toute aide sera appréciée.
PS : Tomcat affiche la configuration JAVA_OPTS au démarrage du fichier catalina.logs
.
1 answers
Lorsque vous exécutez JVM dans docker, vous devez utiliser les paramètres suivants pour spécifier la quantité de mémoire que la machine virtuelle peut prendre de la mémoire totale disponible:
-XX:+UseContainerSupport
-XX:MaxRAMPercentage=70.0
(cet indicateur indique que la JVM peut prendre 70% maximum de la mémoire d'image docker. Par défaut, cette valeur est 25%)
En ce qui concerne GC, vous devez voir quelle construction JVM vous exécutez sur cette image. Peut-être que cette construction ne vous permet pas de spécifier le GC G1 (vous pouvez jeter un oeil ici pour voir pourquoi https://bugs.openjdk.java.net/browse/JDK-8148175)