Je profil en cours d'exécution Java applications souvent avec VisualVM mais il a besoin de X pour fonctionner sur la machine.
Je sais que je peux me connecter via le port de gestion mais ce sera un profilage échantillonné hors ligne qui ne me suffit pas.
Je cherche donc une solution avec laquelle je peux profiler l'utilisation CPU des méthodes d'une application en cours d'exécution Java depuis la ligne de commande. Il me suffit de collecter des données sur le serveur puis les données collectées peuvent être analysées sur une machine différente.
Mise à jour:
Il semble que je doive être plus précis. Je veux profiler une application Java Java en ligne de commande, je ne veux pas l'arrêter et la réexécuter.
L'application jvmtop est un outil pratique pour le profilage à partir de la ligne de commande. Pas besoin d'arrêter le jvm. Usage:
jvmtop.sh --profile <PID>
Vous donnera une sortie comme celle-ci qui sera mise à jour pendant l'exécution de l'application:
Profiling PID 24015: org.Apache.catalina.startup.Bootstrap
36.16% ( 57.57s) hudson.model.AbstractBuild.calcChangeSet()
30.36% ( 48.33s) hudson.scm.SubversionChangeLogParser.parse()
7.14% ( 11.37s) org.kohsuke.stapler.jelly.JellyClassTearOff.parseScript()
...
L'avantage est qu'il ne prend pas l'utilisation de l'instrumentation. Les classes du jvm à profiler ne seront pas modifiées.
Si vous cherchez quelque chose de plus visuel, jetez un œil à jvm-mon qui est basé sur jvmtop
Pouvez-vous collecter 10 ou 20 échantillons de pile avec jstack ? Ensuite, si Foo est une méthode, son utilisation globale du temps est la fraction d'échantillons qui la contient. Son utilisation du processeur est la fraction de ces échantillons qui ne se terminent pas par des E/S ou un appel système. Son "temps propre" est la fraction d'échantillons dans laquelle il est lui-même le terminus.
Je n'ai besoin de rien de joli. Je l'exécute sous le IDE et je les collecte de cette façon, ou j'utilise quelque chose comme jstack qui capture la pile de une application en cours d'exécution.
C'est la technique random-pause .
Ressemble à la façon "intégrée" de profiler une Java à partir de la ligne de commande consiste à la démarrer avec le profilage des paramètres de ligne de commande, comme ceci
$ Java -Xrunhprof:cpu=samples,file=myprogram.hprof ...
Ensuite, examinez le fichier "myprogram.hprof" avec un outil GUI (ou un outil de serveur Web comme jhat ) ou outil de ligne de commande après la fin du processus (et le fichier est créé à cet instant).
Si vous utilisez l'astuce de signal "QUIT", mentionnée https://stackoverflow.com/a/2344436/3245 alors vous pouvez générer un fichier à volonté sans quitter la JVM (il semble s'ajouter à la fichier de sortie précédent). Ou attendez la fin du processus et il générera le fichier.
Ce profileur (intégré) effectue un échantillon rarement, donc généralement un faible ralentissement/impact global.
Nous avons utilisé hprof sur nos serveurs et c'est certainement mieux que sysouts au cas où vous ne pourriez pas exécuter une session VisualVM à part entière.
Les exemples d'utilisation de hprof sont nombreux:
Une façon de profiler une machine virtuelle Java "déjà démarrée" consiste à agréger plusieurs jstacks au fil du temps.
Vous pouvez par exemple les analyser et les afficher sous forme de FlameGraph (voir les détails dans les différentes réponses pour ce lien, je ne les inclurai pas de manière redondante ici).
Vous pouvez exécuter la plupart des profileurs commerciaux à distance afin qu'un agent soit exécuté sur le serveur, puis vous connecter à cet agent via un client sur votre machine de développement. Mon profileur préféré absolu est JProfiler. C'est un achat assez raisonnable et très stable (ce qui n'est pas le cas de tous les profileurs commerciaux).
http://www.ej-technologies.com/products/jprofiler/overview.html
Les autres profileurs commerciaux qui sont stables, mais qui ne sont pas mes préférés sont YourKIT.
Ces petits fournisseurs font de bons outils. Ces outils vous fourniront des tonnes d'informations sur les synchronisations des méthodes, l'utilisation de la mémoire, le GC, etc. Bien plus que jconsole.
Le profilage le plus précis peut être réalisé avec https://github.com/jvm-profiling-tools/async-profiler .
Ce projet est un profileur d'échantillonnage à faible surcharge pour Java qui ne souffre pas du problème de biais Safepoint. Il comprend des API spécifiques à HotSpot pour collecter les traces de pile et suivre les allocations de mémoire. Le profileur fonctionne avec OpenJDK, Oracle JDK et autres Java runtimes basés sur HotSpot JVM.
Voici mon script pour l'installer et l'exécuter à partir de la ligne de commande:
async-profiler.sh
if [ ! -d profiler ]; then
mkdir profiler && cd profiler && curl -L https://github.com/jvm-profiling-tools/async-profiler/releases/download/v1.6-ea/async-profiler-1.6-ea-linux-x64.tar.gz | tar xvz
echo 1 > /proc/sys/kernel/perf_event_paranoid
echo 0 > /proc/sys/kernel/kptr_restrict
#apt install openjdk-8-dbg
else
cd profiler
fi
#jps
./profiler.sh -d 60 -f dump_`date +%Y-%m-%d_%H-%M-%S`.jfr `jps -q`
Il suppose que l'application est exécutée sous le même utilisateur et qu'il existe un seul PID de processus Java à répertorier par jps. La durée du profilage est de 60 secondes. Aucune modification des options de démarrage ou de redémarrage de l'application n'est nécessaire.
L'interface graphique pour l'examen des vidages est intégrée à IntelliJ IDEA Ultimate: https://www.jetbrains.com/help/idea/cpu-profiler.html .