Déboguer les problèmes de performance en production peut être une douleur et, dans certains cas, impossible sans les bons outils. Le profilage Java existe depuis toujours, mais les profileurs java auxquels la plupart des développeurs pensent ne sont que d’un seul type : les profileurs JVM standard.
Cependant, utiliser un seul type de profileur ne suffit pas.
Supposons que vous analysiez les performances de votre application. Il existe de multiples activités de profilage que vous pouvez exécuter. En général, les profileurs standard gèrent le profilage de la mémoire, le profilage du CPU et le profilage des threads.
Mais même avec toute cette couverture, en utilisant une combinaison de plusieurs profileurs, vous trouverez plus de problèmes de performance. C’est parce que chaque profileur est meilleur dans un certain aspect pour chasser un bug de performance.
Dans ce post, nous allons discuter des trois types de profileurs Java et pourquoi nous avons besoin de tous les trois pendant le développement de l’application. Nous commencerons par les types et nous plongerons en profondeur dans chacun d’eux.
Regardons les trois différents types de profileurs Java:
- Profileurs JVM standard qui suivent chaque détail de la JVM (CPU, thread, mémoire, garbage collection, etc).
- Profileurs légers qui mettent en évidence votre application avec un peu d’abstraction.
- Outils de gestion des performances des applications (APM) utilisés pour surveiller les applications en direct dans les environnements de production.
Profileurs JVM standard
Produits comme VisualVM, JProfiler, YourKit et Java Mission Control.
Un profileur Java standard fournit certainement le plus de données, mais pas nécessairement les informations les plus utiles. Cela dépend du type de tâche de débogage.
Les profileurs JVM suivront tous les appels de méthode et l’utilisation de la mémoire. Cela permet à un développeur de plonger dans la structure d’appel à n’importe quel angle qu’il choisit.
Pros:
- Génial pour traquer les fuites de mémoire, les profileurs standard détaillent toute l’utilisation de la mémoire par la JVM et quelles classes/objets sont responsables. La possibilité d’exécuter manuellement le garbage collection puis d’examiner la consommation de mémoire peut facilement braquer les projecteurs sur les classes et les processus qui conservent la mémoire par erreur.
- Bon pour le suivi de l’utilisation du CPU, un profileur Java fournit généralement une fonction d’échantillonnage du CPU pour suivre et agréger le temps du CPU par classe et par méthode pour aider à mettre à zéro les points chauds.
Cons:
- Requiert une connexion directe à la JVM surveillée ; cela finit par limiter l’utilisation aux environnements de développement dans la plupart des cas. (Remarque : certains profileurs peuvent fonctionner à partir de threads et de vidages de mémoire de manière limitée.)
- Ils ralentissent votre application ; une bonne dose de puissance de traitement est nécessaire pour le haut niveau de détail fourni.
Profileurs de transactions Java légers
Produits comme XRebel et Stackify Prefix.
Les profileurs légers adoptent une approche différente pour suivre votre application en s’injectant directement dans le code.
- Les profileurs d’aspect utilisent la programmation orientée aspect (AOP) pour injecter du code au début et à la fin de méthodes spécifiées. Le code injecté peut démarrer une minuterie, puis signaler le temps écoulé lorsque la méthode se termine. Ces profileurs sont simples à configurer, mais vous devez savoir ce qu’il faut profiler. Pour un exemple, voir Spring AOP Method Profiling.
- Les profileurs de l’agent Java utilisent l’API Java Instrumentation pour injecter du code dans votre application. Cette méthode a un meilleur accès à votre application puisque le code est réécrit au niveau du bytecode. Cela permet d’instrumenter tout code s’exécutant dans votre application, qu’il s’agisse de code que vous avez écrit ou de bibliothèques tierces dont dépend votre application. Consultez cette introduction à Java Agents pour voir comment tout cela fonctionne.
Les profileurs d’aspect sont assez faciles à configurer, mais ils sont limités dans ce qu’ils peuvent surveiller et sont encombrés par le détail de tout ce que vous voulez être suivi. Les agents Java ont un grand avantage dans leur profondeur de suivi, mais sont beaucoup plus compliqués à écrire.
Stackify Prefix est un profileur Java orienté développeur qui utilise la méthode de profilage de l’agent Java en coulisse.
La chose cool est que Prefix connaît déjà les classes les plus désirées et les bibliothèques tierces que les développeurs veulent être instrumentées – donc vous n’avez pas à les détailler toutes. De plus, il prend toutes les statistiques de l’instrumentation et les affiche de manière simple et compréhensible.
A titre d’exemple, lors de l’exécution d’une application utilisant Hibernate, Prefix ne détaillera pas seulement le temps écoulé pour les requêtes mais affichera également les valeurs des paramètres pour le SQL généré. Lorsque votre application fait appel à une API SOAP/REST, Prefix fournit le contenu de la requête et de la réponse.
La faible surcharge, le profilage de la JVM Java en production (APM)
Tous les profileurs jusqu’à présent ont été formidables pour le développement, mais le suivi des performances de votre système en production est critique.
La production est toujours un paysage différent – les configurations de développement et de mise en scène n’ont généralement pas les mêmes ensembles de données et la même charge.
Les outils APM Java utilisent généralement la méthode de profilage de Java Agent mais avec des règles d’instrumentation différentes pour leur permettre de fonctionner sans affecter les performances en production. L’astuce avec ces profileurs est de fournir les bonnes informations d’une manière intelligente pour ne pas prendre les cycles CPU.
Le Retrace de Stackify est un outil APM qui utilise la même tech que Stackify Prefix avec quelques ajustements pour fonctionner sans problème dans les environnements de staging et de production.
Cela se fait en agrégeant les statistiques de timing et en échantillonnant les traces. Cela vous donne une visibilité au niveau des méthodes sur le code de votre application qui s’exécute en production.
Donc, lorsque vous avez une requête web lente, cela se traduira par une trace qui apparaîtra dans Retrace. À partir de là, vous pouvez plonger et voir quelles méthodes sont les coupables.
Capture d’écran de Retrace : Agrégation des requêtes Web sur 4 heures
Pourquoi avez-vous besoin des 3 profileurs pour votre application ?
Les profileurs standard sont bons pour trouver les problèmes de performance dans la phase de développement. Mais la production est un scénario différent. Le comportement de votre application peut changer en fonction du trafic entrant, de la demande du serveur, de la réponse et de bien d’autres choses.
Donc, quelle est la solution pour l’environnement de production ? Les outils APM sont la réponse. Les outils APM ciblent l’environnement de production et fournissent un rapport concernant la performance de votre app.
Donc, les profileurs standards aident au développement et les outils APM aident en production. Vous vous demandez peut-être quel est le besoin de profileurs de transactions légers.
Eh bien, les profileurs légers suivent une approche différente du profilage du code. Ils s’injectent directement dans le code – en particulier au début et à la fin d’une méthode.
Ils sont également faciles à mettre en place et consomment relativement moins de ressources. C’est très utile pour les applications qui utilisent la mémoire transactionnelle matérielle. Ces applications exigent des outils d’analyse raffinés qui indiquent exactement quelle méthode ou fonction est à l’origine des problèmes de performance.
En définitive, nous pouvons dire que si vous développez une application complexe, vous aurez besoin des trois profileurs. Chaque type de profileur a une approche unique vérifiant une application pour les problèmes de performance.
L’enquête de RebelLab a également montré que la plupart des entreprises utilisent plusieurs profileurs de code pour trouver des problèmes de performance dans leur application.
Pourquoi certains profileurs Java sont-ils si chers ?
XRebel est un outil cool, mais il coûte 365 $ par an. Stackify Prefix est gratuit et fournit une grande partie des mêmes fonctionnalités.
Le plus gros problème des solutions APM est définitivement leur prix. Elles ont traditionnellement été si chères que seules les plus grandes entreprises pouvaient se les offrir.
Il n’est pas très logique de dépenser environ 100 $ par mois pour un serveur chez Azure ou AWS, puis de dépenser près de 200 $ par mois pour un produit comme New Relic.
Les outils de surveillance ne devraient pas coûter plus cher que les serveurs !
Lire la suite : Le prix de l’APM est maintenant abordable pour tous les développeurs, et pourquoi ils devraient s’en soucier
Wrapping It Up
Maintenant que vous avez appris à connaître les trois types de profileurs de code Java, il est temps de décider si vous avez vraiment besoin de tous ces outils.
La réponse réside dans la nature de votre application.
Si elle est petite comme le système de gestion des dépenses d’une entreprise ou d’un magasin local, le profilage est très simple. Un profileur standard fera l’affaire.
Si vous développez une application web comme le système de suivi d’un établissement de messagerie, votre application peut être consultée par des milliers d’utilisateurs. Dans ce cas, vous aurez également besoin d’outils APM pour l’environnement de production.
Enfin, si votre application est destinée aux systèmes embarqués, vous aurez besoin des trois.
Choisissez bien, et amusez-vous à développer une application qui offre des performances optimales.
.