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.

entrez la description de l'image ici

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.

Author: Joshi Yogesh, 2020-11-23

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)

 0
Author: Octavian R., 2020-11-23 15:38:37