Linux Embedded

Le blog des technologies libres et embarquées

Visualiser l'ordonnancement avec kernelshark

Lorsque l'on travaille dans un environnement contraint et temps réel, il peut-être particulièrement intéressant de visualiser graphiquement l'ordonnancement des processus. Dans un précédent article, vous avez pu lire une introduction à ftrace. kernelshark permet d'obtenir une visualisation graphique du fichier trace généré par trace-cmd, un outil ftrace en ligne de commande.

Enregistrement des traces

Pour effectuer l'enregistrement de traces, le noyau Linux doit être compilé avec le support de Ftrace. Son activation (via make menuconfig) se fait dans le menu Kernel hacking -> Tracers. Il faudra ensuite activer les traceurs qui vous intéressent (kernel functions, scheduling, syscalls, ...).

Ensuite, il vous faudra installer trace-cmd. Si votre gestionnaire de paquets ne le propose pas, récupérez la dernière version ici (prenez l'archive snapshot du dernier tag). Compilez et installez trace-cmd à l'aide des commandes make trace-cmd && make install.

Une fois votre environnement en place, il est possible d'enregistrer tous les évènements ayant lieu sur le système de manière interactive (l'enregistrement s'arrête avec Ctrl^C) :

trace-cmd record -e all -o mes_traces.dat

... ou pendant l'exécution d'un programme (ici ls) :

trace-cmd record -e all -o ls_traces.dat ls /

Pour plus d'informations sur les options, consultez l'aide :

shell> trace-cmd record -h

trace-cmd version 1.0.3

usage:
 trace-cmd record [-v][-e event [-f filter]][-p plugin][-F][-d] \
 [-o file][-s usecs][-O option ][-l func][-g func][-n func] \
 [-P pid][-N host:port][-t][-r prio][-b size][command ...]
 -e run command with event enabled
 -f filter for previous -e event
 -p run command with plugin enabled
 -F filter only on the given process
 -P trace the given pid like -F for the command
 -l filter function name
 -g set graph function
 -n do not trace function
 -v will negate all -e after it (disable those events)
 -d disable function tracer when running
 -o data output file [default trace.dat]
 -O option to enable (or disable)
 -r real time priority to run the capture threads
 -s sleep interval between recording (in usecs) [default: 1000]
 -N host:port to connect to (see listen)
 -t used with -N, forces use of tcp in live trace
 -b change kernel buffersize (in kilobytes per CPU)

Visualisation des traces

Pour visualiser les traces, il est nécessaire d'installer kernelshark. Si votre gestionnaire de paquets ne le propose pas, dans le répertoire des sources de trace-cmd téléchargées précédemment, tapez la commande suivante make gui && make install_gui.

Une fois installé, vous pouvez ouvrir le fichier ls_traces.dat généré précédemment :

kernelshark ls_traces.dat

L'interface est séparée en deux parties :

  • une visualisation de graphes
  • une visualisation précise des évènements

Voici quelques éléments qui pourront aider à commencer :

  • Le menu Filter permet de filtrer des types d'évènements
  • le menu Plots permet de sélectionner les graphes à afficher
  • le zoom en avant se fait en sélectionnant une section du graphe vers la droite
  • le zoom en arrière se fait en sélectionnant une section du graphe vers la gauche
  • le marqueur vert se pose avec un clic gauche
  • le marqueur rouge se pose avec un SHIFT + clic gauche
  • un double clic permet de placer le curseur (pour visualiser les évènements)
  • les couleurs du graphe d'une tâche correspondent aux CPUs sur lesquels celle-ci s'exécute
  • les couleurs du graphe d'un CPU correspondent aux tâches exécutées

Pour plus de détails, consultez cette page.

kernelshark avec PREEMPT_RT

Jouons maintenant avec Linux PREEMPT_RT. Soit le programme téléchargeable ici qui se réveille toute les millisecondes avec un timer POSIX (cf. article sur les timers). Enregistrons alors son exécution sur un système Linux classique que l'on charge avec la commande stress :

On observe donc que la propriété temps réel de l'application n'est pas respectée et qu'un nombre important de réveils sont manqués. Observons ce même programme sur un Linux patché avec PREEMPT_RT :

Cette fois-ci, l'ordonnancement est quasi parfait.

Aller plus loin

trace-cmd et kernelshark permettent donc d'observer le comportement d'un système et de visualiser les résultats graphiquement. Attention cependant, la sortie générée par trace-cmd est volumineuse et pourrait donc modifier le comportement de votre système. L'option "-e all" n'est donc pas toujours appropriée.

Pour aller plus loin, je vous recommande les documents suivants :

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.