[JAVA] Outils d'analyse des performances et de diagnostic des pannes utilisables avec OpenJDK

Les distributions OpenJDK (ci-après, Java ou JDK) qui incluent le JDK Oracle ont divers outils / mécanismes d'analyse, y compris JFR.

Il y a certaines parties où la tendance a changé de JDK7 à JDK12, donc je vais écrire une petite note bâclée.

Mécanisme d'acquisition de métriques

Java dispose de plusieurs méthodes pour obtenir des mesures de performances. Les trois suivants sont typiques.

JMX

Java Management Extensions (JMX) est un protocole de surveillance et de gestion des ressources Java. En termes simples, c'est la version Java de SNMP. Importé de Java 1.5 en tant que JSR-174.

Il est également possible d'utiliser Managed Beans (MBeans) pour obtenir des informations sur le processeur et la mémoire, et pour exécuter des événements spécifiques (par exemple, GC forcé).

Vous pouvez également définir vous-même des MBeans, et comme il s'agit d'une technologie qui a démarré à l'origine avec Java EE, de nombreux conteneurs d'applications tels que Weblogic et GlassFish sont capables d'acquérir diverses métriques telles que le nombre de threads et le nombre de demandes d'attente avec JMX. Je vais. C'est donc le choix le plus élémentaire lors de la surveillance des applications Java.

Cependant, ces dernières années, Jolokia, un OSS qui convertit JMX en HTTP, et Eclipse Microprofile Metrics, une nouvelle interface d'acquisition de métriques qui remplace JMX, sont apparus car il est difficile de se lier au côté outil de surveillance du protocole d'origine. ..

Journal Java

En Java, des journaux détaillés tels que GC peuvent être obtenus à partir de JVM. À l'origine, Java a évolué pour pouvoir collecter divers journaux système avec des mises à niveau de version, mais il était incohérent et il était nécessaire d'apprendre chaque format de journal et méthode de configuration.

Cependant, depuis JDK 9, les spécifications de journalisation système ont été intégrées en tant que journalisation JVM unifiée. En conséquence, la commodité s'est améliorée, mais les options, etc. sont différentes de celles de Java 8, alors soyez prudent lorsque vous visualisez d'anciens documents.

Par exemple, s'il s'agit d'un journal GC, il sera généré dans le fichier journal en le spécifiant dans l'option JVM comme indiqué ci-dessous.

-Xlog:gc*=debug:/path/to/gc_%p_%t.log:time,level,tags:filesize=100m,filecount=7

Vous souhaiterez peut-être également avoir régulièrement des vidages de threads dans votre fichier journal, mais cela n'est pas possible avec la fonction de journalisation de la JVM. Par conséquent, il était courant de créer une commande pour écrire dans un fichier en exécutant périodiquement «jstack», «jcmd» ou «kill -3», ce qui sera décrit plus tard.

Cependant, si vous utilisez JFR, la trace de pile est incluse du côté JFR, ce sera donc suffisant.

JPLIS(javaagent)

Java Programming Language Instrumentation Services (JPLIS) est une interface pour travailler avec des packages inconnus appelés java.lang.instrument. Il est utilisé en spécifiant javaagent comme option JMV.

Il s'agit d'une API dans laquelle l'agent réécrit les informations de classe lorsque la JVM charge la classe. Vous pouvez l'utiliser pour obtenir des informations sur les objets Java ou incorporer un aspect pour le profilage afin d'obtenir des informations de trace.

L'inconvénient est qu'il y a peu de matériaux, mais il est relativement facile à utiliser lorsqu'il est combiné avec AspectJ.

De nombreux APM sont implémentés à l'aide de cet agent Java, car en principe presque toutes les valeurs peuvent être prises. Cependant, en raison des caractéristiques de la réécriture du code d'octet, il y a un risque de provoquer un bogue dont il est difficile d'identifier la cause dans une large gamme, alors assurez-vous de tester / déboguer soigneusement avant de l'utiliser.

Outils standard JDK

Il existe des outils tiers, mais Java fournit par défaut des outils d'analyse et de diagnostic. VisualVM et JMC ne sont plus inclus dans le JDK Oracle en raison de l'ouverture, mais cette fois nous les inclurons dans les outils standard.

VisualVM

L'outil de profilage phare de HotSpot jusqu'à l'intégration de Java Mission Control dans le JDK. La version OSS est développée ci-dessous.

https://visualvm.github.io/index.html

01-02-visualvm.png

L'une des caractéristiques est qu'il a une structure de plug-in car il est basé sur la plate-forme NetBeans.

Vous pouvez surveiller les informations JMX et voir diverses informations telles que le processeur et la mémoire / GC en temps réel et graphiquement. C'est également un outil très sophistiqué qui produit des vidages de tas et prend des instantanés des informations d'analyse.

Cela a été un peu éclipsé depuis que JMC a également été inclus dans HotSpot, mais il est également compatible avec GraalVM, et il semble que la dernière version soit compatible avec JFR même s'il s'agit d'une version préliminaire, c'est donc un outil dont il faut s'inquiéter à nouveau à l'avenir. est.

JDK Mission Control(JMC)

Il s'agit aujourd'hui de l'outil de profilage principal de Java. La version OSS est développée ci-dessous.

https://github.com/JDKMissionControl/jmc

01-02-jmc.png

Initialement appelé JRockit Mission Control, c'est un outil qui intègre l'outil de profilage qui était bien implanté dans JRockit dans HotSpot après l'acquisition de Sun par Oracle.

Également étroitement lié à JFR dérivé de JRockit. .. .. En fait, c'est presque une option en tant qu'outil de visualisation JFR.

En tant que fonction, il s'agit d'un outil d'analyse intégré similaire à Visual VM, et la surveillance JMX en temps réel, le vidage de tas et l'acquisition / analyse JFR sont possibles.

Il est basé sur le framework GUI d'Eclipse par opposition à VisualVM, et dispose également de capacités de plug-in flexibles. L'une des caractéristiques est qu'il existe des plug-ins spécialisés pour des produits tels que Weblogic.

Le nom a changé en "JRock it Mission Control" -> "Java Mission Control" -> "JDK Mission Control" en raison du portage vers HotSpot et OSS, mais l'abréviation reste JMC.

En outre, l'interface utilisateur a considérablement changé depuis le JMC 7 ouvert et la fonction d'analyse automatique a été améliorée.

Cependant, pour le moment, la version officielle n'a pas encore été publiée et le binaire ne peut pas être téléchargé à partir de la version officielle, il est donc toujours nécessaire de le construire vous-même.

Pour le moment, il est préférable d'utiliser "Adopt OpenJDK Mission Control", "Zulu Mission Control" et "Liberica Mission Control" construits par le distributeur OpenJDK.

jcmd

Comme JFR, jcmd est une commande utilisée à l'origine dans JRockit. De nombreux outils de gestion ont également été fournis pour HotSpot développé par Sun, mais comme les commandes sont différentes, il est devenu possible d'effectuer une gestion cohérente en introduisant jcmd.

Principalement, vous pouvez effectuer une opération JFR, get process, get thread dump, etc. Les commandes suivantes sont typiques.

commander La description
jcmd {Aucun argument} Afficher la liste des processus Java comme jps
jcmd {ID de processus} VM.version Afficher les informations de version de JDK pour le processus spécifié
jcmd {ID de processus} VM.flags Afficher toutes les options spécifiées dans la JVM du processus spécifié, y compris les valeurs par défaut
jcmd {ID de processus} Thread.print Obtenir un vidage de thread du processus spécifié
jcmd {ID de processus} GC.heap_dump {Nom du fichier de sortie}} Obtenez un vidage de tas du processus spécifié
jcmd {ID de processus} JFR.start {Option JFR} Lancer l'enregistrement JFR
jcmd {ID de processus} JFR.dump {Option JFR} Arrête l'enregistrement pendant l'exécution et sort le contenu enregistré dans un fichier à partir du tampon circulaire
jcmd {ID de processus} JFR.check Afficher les informations d'exécution JFR
jcmd {ID de processus} JFR.stop Arrêter l'enregistrement JFR

JFR tool

JFR Tool est une nouvelle commande introduite à partir de JDK12. Un outil pour convertir des fichiers JFR en JSON et XML, et pour fractionner / intégrer des fichiers JFR.

commander La description
jfr print [--xml, --json]
[--categories {filter}]
[--events {filter}]
[--stack-depth {depth}]
{nom de fichier}
Renvoie les éléments spécifiés dans le fichier JFR dans n'importe quel format.
Le format de sortie est TEXT, XML,Sélectionnez parmi JSON. Les événements cibles peuvent être filtrés en spécifiant des catégories et des événements. Plusieurs filtres peuvent être spécifiés séparés par des virgules.
jfr metadata {nom de fichier} Afficher les méta-informations JFR
jfr summary {nom de fichier} Afficher les informations récapitulatives JFR
jfr assemble {Nom du référentiel} {nom de fichier} Combinez plusieurs fichiers JFR dans le référentiel en un seul fichier JFR
jfr disassemble [--output {Nom du répertoire}]
[--max-chunks {Taille}]
[--max-size {Taille}]
{nom de fichier}
指定したJFRファイルを任意のTailleでディレクトリに分割して保存する

jfr print est utile lorsque vous souhaitez intégrer JFR avec un autre outil au lieu de JMC. Par exemple, lorsque les informations GC sont acquises, une grande quantité du JSON suivant est générée.

$ jfr print --json --categories GC --events jdk.GCPhaseParallel sample.jfr
{
    "recording": {
        "events": [{
            "type": "jdk.GCPhaseParallel"
            ,
            "values": {
                "startTime": "2019-09-04T09:43:30.056871672-08:00",
                "duration": "PT0.000000518S",
                "eventThread": {
                    "osName": "GC Thread#5",
                    "osThreadId": 38915,
                    "javaName": null,
                    "javaThreadId": 0,
...

De plus, divers traitements peuvent être effectués en connectant le résultat de sortie JSON à la commande jq avec un tube.

$ jfr print --json \
    --categories GC,Profiling,Processsor,Heap,MyApp \
    --events jdk.GCPhaseParallel,jdk.ExecutionSample,jdk.CPULoad,jdk.GCHeapSummary  \
    chunk.jfr \
|jq '.recording.events[]' | jq -c '.|= .+ {"Key": "Value"}'

{"type":"jdk.CPULoad","value":{"startTime":"2019-09-08T16:13:01.980014338-
08:00","jvmUser":0.23814254,"jvmSystem":0.019405695,"machineTotal":0.5409429},"Key":"
Value"}
...

Le fractionnement et la fusion avec «assembler / désassembler» est une fonctionnalité très utile pendant le fonctionnement. Les détails seront décrits dans le chapitre 5, mais en utilisant cette fonction, vous pouvez réaliser une rotation de fichiers quotidienne et horaire et une sauvegarde de JFR Fal.

Outil standard JDK (ancienne version)

C'est un groupe d'outils qui n'a pas été beaucoup utilisé récemment parce que de nouveaux outils alternatifs ont été créés.

JConsole

JMX est un outil de profilage. Comme il existe depuis longtemps, il est souvent introduit comme un outil de test de performance dans les vieux livres et sites Web.

JMX peut acquérir des informations telles que le processeur, le tas, le GC, le nombre de classes de charge, etc. avec la spécification appelée SNMP pour Java. C'est un bon outil avec une interface utilisateur simple, mais récemment, j'ai l'impression d'avoir terminé mon rôle car je peux faire la même chose avec VisualVM et JMC.

hprof

Un ancien outil de profilage standard Java. Vous pouvez obtenir / analyser l'utilisation du processeur, les informations du tas, le vidage du tas, etc.

Cependant, ce n'est pas un type qui peut être appliqué à une production avec des frais généraux considérables. De plus, au moment du développement et des tests, le profileur fourni avec l'EDI semble être plus facile à utiliser maintenant.

jps

Cette commande affiche l'ID de processus de la JVM. Dans le cas de Linux, vous pouvez bien sûr l'identifier avec la commande ps, mais c'est pratique pour le filtrage car les processus autres que Java ne sont pas affichés.

jstat

Cette commande vérifie les informations du tas, y compris GC. La structure de mémoire de Java a diverses hiérarchies et est compliquée, mais elle peut être surveillée.

jstack

Cette commande obtient un vidage de thread de la JVM.

Il est souvent utilisé lors de l'analyse des verrous de thread tels que les verrous morts. Plutôt que de l'utiliser seul, transmettez le vidage de thread acquis à "Samurai", "Thread Logic" et "TDA" pour utilisation.

Étant donné que le vidage des threads est une information importante en cas d'échec, créez un script qui l'exécute régulièrement ou appuyez dessus plusieurs fois en cas d'échec de l'acquisition des informations de thread.

jmap

jmap est un outil pour obtenir des vidages de tas.

Vous pouvez obtenir des informations de processus, des informations sur le tas, des informations sur le chargeur de classe, un résumé du tas, un histogramme, des informations statistiques et diverses autres informations.

La sortie est généralement analysée avec jhat ou un outil tiers. Cependant, jmap peut provoquer un GC complet et doit être utilisé avec précaution en production.

Résumé

Voici un bref résumé de l'utilisation des outils d'acquisition / diagnostic de métriques en Java. Je ne pense pas que ce soit une mauvaise idée d'utiliser l'ancienne commande, mais comme les opérations sont unifiées, il est fondamentalement sûr d'utiliser la dernière.

En particulier, JFR Tool est un outil dans lequel je me suis familiarisé avant de le savoir, mais il est assez pratique, donc j'aimerais l'utiliser activement.

Alors bon piratage!

référence

Recommended Posts

Outils d'analyse des performances et de diagnostic des pannes utilisables avec OpenJDK
Organiser les méthodes qui peuvent être utilisées avec StringUtils
Créer un contrôle de page qui peut être utilisé avec RecyclerView
Base de données Firebase-Realtime sur Android pouvant être utilisée avec copie
Syntaxe et conditions d'occurrence d'exception pouvant être utilisées lors de la comparaison avec null en Java
Outil d'analyse statique pouvant être utilisé avec GitHub [version Java]
SwiftUI View qui peut être utilisé en combinaison avec d'autres frameworks
[Rails] "Pry-rails" qui peuvent être utilisés lors de l'enregistrement avec la méthode create
Méthodes de tableau Ruby pouvant être utilisées avec Rails (autres que chacun)
[OpenJDK11 & JavaFX13] Créez une application javaFX avec IntelliJ + gradle et créez un package qui peut être distribué avec un JRE léger.
[Swift] Color Picker qui peut être utilisé avec copier-coller (palette qui vous permet de sélectionner librement les couleurs)
Création d'un environnement où kotlin peut être compilé avec cli avec docker et exécuté avec java
Plage où les variables peuvent être utilisées avec ruby [Scope]
À propos du problème que hidden_field peut être utilisé de manière insensée
Touches de raccourci pratiques pour Eclipse
Organiser les méthodes qui peuvent être utilisées avec StringUtils
Apprendre Ruby avec la sélection des débutants AtCoder [Quelques sommes] Augmentez les méthodes qui peuvent être utilisées
Problèmes facilement confondus avec Java et JavaScript
Outils et commandes pouvant être utiles pour le dépannage Java
J'ai posé une question qui peut être utilisée pour des entretiens techniques
Compétences de puissance qui peuvent être utilisées rapidement à tout moment - Réflexion
À propos de la plage et de la portée dans lesquelles les variables Day16 peuvent être utilisées
Résumé des JDK pouvant être installés avec Homebrew (à partir de novembre 2019)