Oups j’ai oublié d’activer les logs GC

1 - Introduction

Votre application vient enfin d’être mise en production après la phase de test (fonctionnel, etc.). Les tests ont été concluant, vous êtes donc serein.

Trois jours après, une alerte remonte sur la consommation mémoire élevée. Pour résoudre ce problème, vous faites appel à un spécialiste qui vous demande les logs GC.

Malheureusement ils n’ont pas été activés et il n’est pas possible d’arrêter le serveur pour ajouter les paramètres à la JVM (en particulier pour -XX:+PrintGCDetails) qui nous permettraient d’avoir ces fameux logs.

2 - La solution : JMX

Heureusement dans le monde Java il existe JMX qui nous permet de superviser/récupérer des métrics et de modifier certaines d’entre elles.

Le MBean JMX qui nous intéresse est com.sun.management:type=HotSpotDiagnostic et en particulier la fonction setVMOption().

astuces_overhead_gc_01

Cette fonction va nous permettre d’activer le paramètre -XX:+PrintGCDetails sans avoir à redémarrer notre JVM.

Activons-le avec setVMOption (PrintGCDetails, true).

astuces_overhead_gc_02

Une fois activé, les logs GC apparaissent dans la sortie standard du programme.

[GC [DefNew: 14971K->865K(15808K), 0.0027772 secs] 38315K->24285K(50768K), 0.0221390 secs] [Times: user=0.00 sys=0.00, real=0.02 secs]

3 - Et l'overhead dans tout ça ?

Nous avons enfin un moyen d’activer les logs GC mais quelqu’un de l’équipe demande si l’overhead de l’activation ne risque pas d’empirer le problème ou d’en créer des nouveaux.

Comme nous l'avons vu sur ce précédent article, un overhead trop important peut modifier le comportement (mémoire, etc.) de l’application.

Un PoC (Proof Of Concept) afin de tester l'overhead sur la préproduction est décidé. Afin de le réaliser on décide d'utiliser Apache JMeter associé au langage de script Groovy.

Cette solution est choisi, car l’intégration entre Groovy & JMX d’un coté et Groovy & Apache JMeter d’un autre coté est très simple à mettre en œuvre.

Commençons par notre script JMX qui va activer le paramètre PrintGCDetails.

L’intégration entre Apache JMeter et Groovy se fera à l’aide de l’élément Echantillon JSR223.

astuces_overhead_gc_03

Cet élément permet d’exécuter des scripts dans différents langage dans notre scénario Apache JMeter.

Par défaut, Apache JMeter n’intègre pas Groovy et donc il faut installer l’implémentation Groovy (un fichier jar) dans le CLASSPATH (sous répertoire lib d’Apache JMeter).

Pour cela il suffit de mettre le fichier groovy-all-*.*.*.jar livré avec Groovy dans le sous répertoire lib d’Apache JMeter.
Après un redémarrage d’Apache JMeter, on a accès à Groovy avec l’élément Echantillon JSR223.

astuces_overhead_gc_04

Il nous reste à copier le script dans le champ prévu à cet effet.

astuces_overhead_gc_05

Et voila, on peut maintenant commencer notre PoC.

Partons de l’exemple réalisé lors de la présentation de JMeter avec l’application PetClinic.

Le principe est d’avoir un autre groupe d’unités qui va exécuter une seul fois notre élément Echantillon JSR223 après plusieurs minutes de test (nombre à définir en fonction du temps de chauffe de l’application).

Par exemple, activons les logs GC après 20 minutes de test.

Dans un premier temps on fait durer notre test pendant 30 minutes.

astuces_overhead_gc_06

Ajoutons notre groupe d’unités qui va activer nos logs GC 20 minutes après le début du test.

astuces_overhead_gc_07

astuces_overhead_gc_08

Exécutons notre test.

Pour nos résultats on va comparer les temps de réponse sur la période entre 10 et 20 minutes et la période après l’activation des logs GC (entre 20 et 30 minutes).

Comme on peut le voir sur le graphique, dans ce cas la (avec cette application, cette charge cible, etc.), l’impact est négligeable.

astuces_overhead_gc_09

Rassuré par les résultats, l’activation des logs GC est réalisé en production sans redémarrage afin de traiter le problème de mémoire.

4 - Conclusion

Comme on a pu le voir, les possibilités offertes par JMX sont énormes. Possibilités que l’on peut exploiter facilement avec Apache JMeter et Groovy.
Ce que l’on a fait en activant les logs GC d’une application sans la redémarrer afin de calculer l’overhead de l’activation.

Il y a encore de nombreuses choses que l’on peut faire avec JMX que je vous laisse tester, car la pratique est essentielle dans notre métier.

 

Laisser un commentaire

Merci d'effectuer cette opération simple pour valider le commentaire *

Mots-clés
RSS Feed