Learning Trace Using eBPF: A Guide and Exemples

Bonjour, Habr! J'attire votre attention sur la traduction d'un article de Brendan Gregg sur eBPF

Il y a eu au moins 24 présentations eBPF à la conférence Linux Plumbers. Il est rapidement devenu non seulement une technologie inestimable, mais également une compétence recherchée. Vous aimeriez peut-être vous fixer des objectifs pour la nouvelle année - apprenez l'eBPF!


Le terme eBPF devrait signifier quelque chose de substantiel, comme le jeu d'instructions du noyau virtuel (VKIS), mais son origine est un filtre de paquets Berkeley étendu. Il est applicable dans de nombreux domaines, tels que les performances du réseau, les pare-feu, la sécurité, le traçage et les pilotes de périphérique. Pour certains d'entre eux, de nombreuses informations sont disponibles gratuitement sur Internet - par exemple, le traçage, mais pour d'autres, ce n'est pas encore le cas. Le terme trace fait référence aux outils d'analyse et de surveillance des performances qui peuvent générer des informations pour chaque événement. Vous avez peut-être déjà utilisé un traceur - tcpdump et strace sont des traceurs spécialisés.


Dans cet article, je vais décrire le processus d'étude de l'utilisation de eBPF à des fins de traçage, regroupé en sections pour les utilisateurs débutants, avancés et avancés. En résumé:


  • Débutant: lancement d'outils Cci
  • Expérimenté: développement d'outils bpftrace
  • Avancé: développement d'outils Cci , contribution à Cci et Bpftrace

Débutants


1. Que sont eBPF, bcc, bpftrace et iovisor?


eBPF fait la même chose pour Linux que JavaScript pour HTML, en quelque sorte. Ainsi, au lieu d'un site HTML statique, JavaScript vous permet de définir des mini-programmes qui s'exécutent sur des événements - comme un clic de souris - qui s'exécutent sur une machine virtuelle sécurisée dans un navigateur. Et avec eBPF - au lieu de modifier le noyau, vous pouvez désormais écrire des mini-programmes qui s'exécutent sur des événements comme les E / S disque sur une machine virtuelle sécurisée dans le noyau. En fait, eBPF ressemble plus à une machine virtuelle v8 qui exécute JavaScript qu'à JavaScript lui-même. eBPF fait partie du noyau Linux.


La programmation directement dans eBPF est incroyablement difficile, tout comme dans le bytecode v8. Mais personne ne code en v8: tout le monde écrit en JavaScript, ou souvent dans un framework au dessus de JavaScript (jQuery, Angular, React, etc.). Même chose avec eBPF. Les gens l'utiliseront et écriront du code via des frameworks. Les principaux pour le traçage sont bcc et bpftrace . Ils ne vivent pas dans la base de code du noyau; ils vivent dans le projet Linux Foundation sur un github appelé iovisor .


2. Est-il possible de tracer en utilisant eBPF?


Cet utilitaire basé sur eBPF montre les sessions TCP entièrement établies avec leur ID de processus (PID), le nom de la commande (COMM), les octets envoyés et reçus (TX_KB, RX_KB) et la durée en millisecondes (MS):

# tcplife
 PID COMM LADDR LPORT RADDR RPORT TX_KB RX_KB MS
 22597 recordProg 127.0.0.1 46644 127.0.0.1 28527 0 0 0,23
 3277 redis-serv 127.0.0.1 28527 127.0.0.1 46644 0 0 0,28
 22598 boucle 100,66.3.172 61620 52.205.89.26 80 0 1 91,79
 22604 boucle 100,66.3.172 44400 52.204.43.121 80 0 1121,38
 22624 recordProg 127.0.0.1 46648 127.0.0.1 28527 0 0 0,22
 3277 redis-serv 127.0.0.1 28527 127.0.0.1 46648 0 0 0,27
 22647 recordProg 127.0.0.1 46650 127.0.0.1 28527 0 0 0,21
 3277 redis-serv 127.0.0.1 28527 127.0.0.1 46650 0 0 0,26
 [...] 


Ce n'est pas cet eBPF qui le rend possible - je peux réécrire tcplife pour utiliser des technologies de noyau plus anciennes. Mais si je le faisais, nous n'exécuterions jamais un tel outil en production en raison de performances réduites, de problèmes de sécurité ou des deux. eBPF a rendu cet outil pratique : il est efficace et sûr. Par exemple, il ne suit pas tous les packages, comme cela a été fait avec les approches précédentes, et cela pourrait entraîner une baisse excessive des performances. Au lieu de cela, il suit uniquement les événements de session TCP qui se produisent beaucoup moins fréquemment. Cela rend les frais généraux si bas que nous pouvons exécuter cet outil en mode 24x7.


3. Comment dois-je l'utiliser?


Les débutants devraient commencer à explorer le Cci. Voir les instructions d'installation de bcc pour votre système d'exploitation. Pour Ubuntu, cela ressemble à ceci:


# sudo apt-get update
# sudo apt-get install bpfcc-tools
# sudo / usr / share / bcc / tools / opensnoop
 PID COMM FD ERR PATH
 25548 gnome-shell 33 0 / proc / self / stat
 10190 opensnoop -1 2 /usr/lib/python2.7/encodings/ascii.x86_64-linux-gnu.so
 10190 opensnoop -1 2 /usr/lib/python2.7/encodings/ascii.so
 10190 opensnoop -1 2 /usr/lib/python2.7/encodings/asciimodule.so
 10190 opensnoop 18 0 /usr/lib/python2.7/encodings/ascii.py
 10190 opensnoop 19 0 /usr/lib/python2.7/encodings/ascii.pyc
 25548 gnome-shell 33 0 / proc / self / stat
 29588 interrogation d'appareil 4 0 / dev / bus / usb
 ^ C

Ici, j'ai fini par ouvrir noop pour tester la fonctionnalité des outils. Si vous êtes allé si loin, vous avez certainement utilisé eBPF!


Pour des sociétés comme Netflix et Facebook, bcc est installé par défaut sur tous les serveurs. Vous voulez peut-être faire de même.


4. Existe-t-il un guide pour débutants?


Oui, j'ai écrit un guide sur bcc, qui est un bon point de départ pour les débutants dans le traçage avec eBPF:



En tant que débutant, vous n'avez pas besoin d'écrire de code pour eBPF. bcc contient déjà plus de 70 outils que vous pouvez utiliser immédiatement. Ce guide vous guidera à travers les étapes à travers les onze suivantes: execsnoop, opensnoop, ext4slower (ou btrfs *, xfs *, zfs *), biolatency, biosnoop, cachestat, tcpconnect, tcpaccept, tcpretrans, runqlat et profile.


Après les avoir essayés, il vous suffit de savoir qu'il existe de nombreux autres moyens:



Ils sont également entièrement documentés avec des outils de page de manuel et des exemples de fichiers. Les exemples de fichiers (* _example.txt dans bcc / tools) contiennent des captures d'écran avec des explications: par exemple, biolatency_example.txt . J'en ai écrit beaucoup (pages de manuel et outils) qui ressemblent à 50 articles de blog supplémentaires, vous les trouverez dans le référentiel bcc.


Ce qui manque, ce sont de vrais exemples de production. J'ai écrit cette documentation lorsque eBPF était si nouveau qu'il n'était disponible que dans nos environnements de test, donc la plupart des exemples sont artificiels. Au fil du temps, nous ajouterons des exemples concrets. C'est là que les débutants peuvent aider: si vous résolvez un problème, envisagez d'écrire un article et de partager des captures d'écran ou de les ajouter en tant que fichiers d'exemple.


Pour les expérimentés


À ce stade, vous devez déjà exécuter bcc et essayer ces outils, tout en souhaitant les modifier et écrire vos propres outils. La meilleure façon est de passer à bpftrace, qui contient un langage de haut niveau beaucoup plus facile à apprendre. L'inconvénient est qu'il n'est pas aussi flexible que le Cci, vous pouvez donc rencontrer des restrictions et vouloir revenir au Cci.


Reportez-vous aux instructions d'installation de bpftrace . Il s'agit d'un projet plus récent, donc au moment d'écrire ces lignes, les packages n'étaient pas encore compilés pour tous les systèmes. À l'avenir, il devrait simplement s'agir d'apt-get install bpftrace ou quelque chose de similaire.


1. tutoriel bpftrace


J'ai développé un tutoriel qui enseigne comment utiliser bpftrace à travers une série de lignes simples:



Il y a 12 leçons qui vous apprendront à utiliser bpftrace étape par étape. Voici un exemple:


# bpftrace -e 'tracepoint: syscalls: sys_enter_open {printf ("% d% s \ n", pid, str (args-> filename)); } '
 Fixation d'une sonde ...
 181 / proc / cpuinfo
 181 / proc / stat
 1461 / proc / net / dev
 1461 / proc / net / if_inet6
 ^ C

Il utilise l'appel système ouvert comme point de trace pour suivre le PID et les chemins d'accès aux fichiers.


2. Guide de référence de bpftrace


Pour plus d'informations sur bpftrace, j'ai écrit un guide contenant des exemples de syntaxe, des tests et des commandes intégrées:



C'est par souci de concision: j'essaie de placer le titre, le CV et la capture d'écran sur une seule page. Je pense que c'est trop long - si vous cherchez quelque chose et que vous devez faire défiler la page plusieurs fois.


3. bpftrace dans les exemples


Il y a plus de 20 outils dans le référentiel bpftrace que vous pouvez consulter avec des exemples:



Par exemple:


# cat tools / biolatency.bt
 [...]
 COMMENCER
 {
     printf ("Tracing block I / O device ... Hit Ctrl-C to end. \ n");
 }

 kprobe: blk_account_io_start
 {
     @start [arg0] = nsecs;
 }

 kprobe: blk_account_io_completion
 / @ start [arg0] /

 {
     @usecs = hist ((nsecs - @start [arg0]) / 1000);
     supprimer (@start [arg0]);
 }

Comme bcc, ces utilitaires ont des pages de manuel et des exemples de fichiers. Par exemple, biolatency_example.txt .


Pour avancé


1. Nous étudions le développement de bcc


J'ai créé deux guides pour vous aider:



Il existe également de nombreux exemples dans bcc / tools / *. Py. Les outils Cci se composent de deux parties: le code BPF pour un noyau écrit en C et un outil de niveau espace utilisateur écrit en Python (ou lua ou C ++). Le développement des outils cci est assez avancé et peut inclure quelques petits composants du noyau ou des éléments d'application internes.


2. Participation au développement


L'aide est la bienvenue avec:



Pour bpftrace, j'ai créé le guide de développement interne bpftrace . C'est difficile lorsque vous programmez en llvm IR, mais si vous êtes prêt à accepter le défi ...


Il y a aussi le cœur d'eBPF (aka BPF): si vous regardez les problèmes bcc et bpftrace, vous y verrez plusieurs demandes d'amélioration. Par exemple, la balise kernel dans bpftrace . Consultez également la liste de diffusion netdev pour les derniers développements du noyau BPF qui sont ajoutés à net-next avant de fusionner avec la ligne principale Linux.


En plus d'écrire du code, vous pouvez également participer aux tests, à la création de packages, aux blogs et aux discussions.


Conclusion


eBPF fait beaucoup de choses différentes. Dans cet article, j'ai étudié la maîtrise de l'eBPF pour le traçage et l'analyse des performances. En résumé:


  • Débutant: lancement d'outils Cci
  • Expérimenté: développement d'outils bpftrace
  • Avancé: développement d'outils Cci , contribution à Cci et Bpftrace

J'ai également une page séparée sur les outils de traçage eBPF , qui couvre tout cela plus en détail. Bonne chance!

Source: https://habr.com/ru/post/fr435142/


All Articles