Oracle porte peu à peu DTrace sur Linux

Oracle développe peu à peu DTrace sur sa distribution Linux grace au noyau UEK. D’après l’article de Lenz Grimmer sur le blog Oracle Linux, la future version d’Oracle UEK3 incluera nativement les composants GPL d’une version de Dynamic Tracing pour Linux développée par Oracle. La manière dont ses pendants CDDL : modules, bibliothèques et outils seront distribués est encore obscure… Je suppose que le temps le dira.
Puisque UEK3 est désormais disponible en version beta1, vous pouvez l’installer et le tester sur n’importe quel serveur ou machine virtuelle Oracle Linux 6.4. Enregistrez public-yum.oracle.com/beta sur votre système et installez les paquets associés avec YUM. Le channel inclut tous les RPMs qu’il faut pour utiliser Linux DTrace 0.4. Reportez-vous à Oracle Linux – Dynamic Tracing Guide for Release 6 et explorez le web pour aller plus loin. Vous trouverez, sans difficulté, des dizaines d’articles et de sites qui traitent de DTrace.
Cet article présente l’utilisation de “User-Level Statically Defined Tracing” ou USDT avec Linux et DTrace. Cette fonctionnalité est nouvelle avec la version 0.4 de DTrace pour Linux et n’est pas encore décrite dans la documentation, même si elle n’est pas plus compliquée à utiliser avec DTrace pour Linux qu’avec tout autre système.
Commençons avec quelques commentaires :

  • Si vous ne connaissez pas DTrace… ce que vous devez savoir c’est que (1) DTrace permet de tracer tous les appels d’un système du noyau à l’espace utilisateur. (2) L’overhead est minimum de sorte que Dynamic Tracing peut être utilisé en production et que vous puissiez suivre et compter tous les appels que vous voulez. Plus que tout : (3) la solution est sécurisée, pas simplement fiable, mais sécurisée !
  • Cela étant dit, il s’agit peut-être bien d’une coincidence si Oracle DTrace pour Linux est la version 0.4 et pas la version 0.9 ou 1.0 mais c’est surtout une bonne chose. La version actuelle de DTrace est encore loin d’être complète et cela même si les fonctionnalités ont été largement améliorées. Malgré cela, après avoir joué quelques heures avec DTrace avec il apparait clairement que l’outil peut d’ores et déjà apporter énormément au diagnostic des problèmes de performance sur Linux.
  • DTrace et le support de USDT sur Linux, même s’ils sont restreints à la distribution d’Oracle peuvent changer la vie des administrateurs système. Cela ouvre la voie à de nombreuses améliorations pour tracer les composants fonctionnant sur la stack Oracle comme Java, MySQL, Apache ou PHP. On pourrait même rếver, qu’un jour, les bases de données Oracle…
  • Difficile de parler de DTrace sur Linux sans évoquer Systemtap. Tout ce qui suit ci-dessous peut être réalisé de manière très similaire avec Systemtap. Aucun doute ! D’un côté Systemtap emprunte beaucoup à DTrace. Pourtant la philosophie de l’outil développé par Redhat est également très différente.

Sondes et programmes C/C++

USDT permet d’inclure des sondes personnalisées dans des programmes et d’intéragir avec ces sondes sur les systèmes en production. Le fichier header sys/sdt.h fournit les directives DTRACE_PROBEn qui permettent ces interactions.
Pour utiliser ces sondes, créez un fichier .d qui contient leur définition. Vous trouverez ci-dessous le contenu d’un exemple appelé demo_probes.d. Il inclut : le nom de la sonde, de son fournisseur et le type des paramètres associés. Ces éléments seront utilisés par le programme et envoyés au noyau, le cas échéant, pour que vous puissiez y accèder via DTrace :

provider demo {
 probe progress__counter(int);
};

Une fois la sonde déclarée, you pouvez la mettre en oeuvre dans votre programme à l’aide de la macro adéquate comme dans le programme demo.c ci-dessous :

#include <sys/sdt.h>
/*
 ** USDT probes with DTrace and UEK3 beta1
 **/
int main(int argc, char *argv[]) {
   int i=0;
   while (1) {
      sleep(1);
      i++;
      DTRACE_PROBE1(demo, progress__counter, i);
   }
}

Compilez le programme et générez un fichier .o à partir du code source comme ci-dessous :

gcc -c -o demo.o demo.c

Générez un fichier demo_probes.o à partir du .d et du fichier demo.o. Ce programme contient les fonctions DTrace statiques qui notifient le Kernel lorsque les sondes sont utilisées :

dtrace -G -s demo_probes.d demo.o

Générez l’exécutable à l’aide des deux fichiers .o construits précédemment. Celui-ci embarque votre sonde DTrace :

gcc -o demo demo_probes.o demo.o

Intéragir avec vos programmes depuis DTrace

Pour interagir avec votre programme depuis DTrace, vous devez charger le module fasttrap dans votre kernel UEK3 :

modprobe dtrace
modprobe profile
modprobe sdt
modprobe systrace
modprobe dt_test
modprobe fasttrap

Note:
Vous pouvez en fait charger ce module après avoir démarré le programme. Cela signifie que, même si un démon a été démarré antérieurement, il sera possible d’utiliser DTrace pour suivre son fonctionnement s’il fournit des sondes USDT.

Une fois le module démarré, vous pouvez utiliser DTrace pour lister l’ensemble des sondes avec lesquelles vous voulez interagir à l’aide de l’option “-l” :

dtrace -c ./demo -P 'demo$target' -l
ID   PROVIDER   MODULE   FUNCTION  NAME
641  demo2340     demo       main  progress-counter

Vous pouvez ensuite démarrer le programme en même temps qu’un script .d depuis DTrace comme ceci :

dtrace -c ./demo -n '::::progress-counter { trace(arg0); }'
dtrace: description '::::progress-counter ' matched 1 probe
CPU  ID          FUNCTION:NAME
  0 641  main:progress-counter   1
  0 641  main:progress-counter   2
^C
  0 641  main:progress-counter   3

Si besoin, vous pouvez également vous connecter à un programme déjà démarré :

./demo &
[1] 2429
dtrace -p 2429 -n '::::progress-counter { trace(arg0); }'
dtrace: description '::::progress-counter ' matched 1 probe
CPU  ID          FUNCTION:NAME
  0 641  main:progress-counter   35
  0 641  main:progress-counter   36
  0 641  main:progress-counter   37
^C
  0 641  main:progress-counter   38

Aller plus loin…

Pour continuer avec cette version développée par Oracle de DTrace, reportez-vous à Oracle® Linux – Dynamic Tracing Guide for Release 6 qui couvre la version 0.3.2 pour l’instant.
Evidemment, nous attendons tous avec impatience plus de DTrace pour Linux. Cette version 0.4 est déjà, de loin, bien meilleure que la version précédente qui avait faire dire aux créateurs de l’originale « Oracle’s port: this is not DTrace« . En tout cas et au moins, je n’ai rencontré aucun problème en utilisant un server SSHD avec toutes les sondes du noyau activées.
Désormais que l’outil est disponible et supporte USDT, il reste à voir si Oracle prévoit de publier des versions avec lesquelles des sondes DTrace sont actives pour l’ensemble des technologies clés telles que Java ou MySQL sur sa distribution Linux. Là aussi, le temps nous le dira… Il se pourrait d’ailleurs que nous n’ayons pas à attendre longtemps : Chris Jones a déjà démarré – terminé ? – ce travail avec PHP !