GNU/Linux >> Tutoriels Linux >  >> Linux

Une introduction à bpftrace pour Linux

Bpftrace est un nouveau traceur open source pour Linux permettant d'analyser les problèmes de performances de production et de dépanner les logiciels. Ses utilisateurs et contributeurs incluent Netflix, Facebook, Red Hat, Shopify et d'autres, et il a été créé par Alastair Robertson, un talentueux développeur basé au Royaume-Uni qui a remporté plusieurs concours de codage.

Linux dispose déjà de nombreux outils de performance, mais ils sont souvent basés sur des compteurs et ont une visibilité limitée. Par exemple, iostat(1) ou un agent de surveillance peut vous indiquer votre latence moyenne de disque, mais pas la distribution de cette latence. Les distributions peuvent révéler plusieurs modes ou valeurs aberrantes, l'un ou l'autre pouvant être la véritable cause de vos problèmes de performances. Bpftrace est adapté à ce type d'analyse :décomposer les métriques en distributions ou journaux par événement et créer de nouvelles métriques pour la visibilité dans les angles morts.

Vous pouvez utiliser bpftrace via des one-liners ou des scripts, et il est livré avec de nombreux outils prédéfinis. Voici un exemple qui trace la distribution de la latence de lecture pour le PID 181 et l'affiche sous la forme d'un histogramme puissance de deux :

# bpftrace -e 'kprobe:vfs_read /pid == 30153/ { @start[tid] = nsecs; }
kretprobe:vfs_read /@start[tid]/ { @ns = hist(nsecs - @start[tid]); delete(@start[tid]); }'
Attaching 2 probes...
^C

@ns:
[256, 512)         10900 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                      |
[512, 1k)          18291 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|
[1k, 2k)            4998 |@@@@@@@@@@@@@@                                      |
[2k, 4k)              57 |                                                    |
[4k, 8k)             117 |                                                    |
[8k, 16k)             48 |                                                    |
[16k, 32k)           109 |                                                    |
[32k, 64k)             3 |                                                    |

Cet exemple instrumente un événement parmi des milliers disponibles. Si vous rencontrez un problème de performances étrange, il existe probablement une doublure bpftrace qui peut vous éclairer. Pour les grands environnements, cette capacité peut vous aider à économiser des millions. Pour les environnements plus petits, il peut être plus utile pour aider à éliminer les valeurs aberrantes de latence.

Le Terminal Linux

  • Les 7 meilleurs émulateurs de terminaux pour Linux
  • 10 outils de ligne de commande pour l'analyse de données sous Linux
  • Télécharger maintenant :Aide-mémoire SSH
  • Aide-mémoire des commandes Linux avancées
  • Tutoriels de ligne de commande Linux

J'ai déjà écrit sur bpftrace par rapport à d'autres traceurs, y compris BCC (BPF Compiler Collection). BCC est idéal pour les outils et agents complexes en conserve. Bpftrace est idéal pour les scripts courts et les enquêtes ad hoc. Dans cet article, je résumerai le langage bpftrace, les types de variables, les sondes et les outils.

Bpftrace utilise BPF (Berkeley Packet Filter), un moteur d'exécution intégré au noyau qui traite un jeu d'instructions virtuel. BPF a été étendu (alias eBPF) ces dernières années pour fournir un moyen sûr d'étendre les fonctionnalités du noyau. C'est également devenu un sujet brûlant dans l'ingénierie des systèmes, avec au moins 24 présentations sur BPF lors de la dernière Linux Plumber's Conference. BPF est dans le noyau Linux, et bpftrace est le meilleur moyen de commencer à utiliser BPF pour l'observabilité.

Consultez le guide bpftrace INSTALL pour savoir comment l'installer et obtenir la dernière version ; 0.9.2 vient de sortir. Pour les clusters Kubernetes, il existe également kubectl-trace pour l'exécuter.

Syntaxe

probe[,probe,...] /filter/ { action }

La sonde spécifie les événements à instrumenter. Le filtre est facultatif et peut filtrer les événements en fonction d'une expression booléenne, et l'action est le mini-programme qui s'exécute.

Voici bonjour le monde :

# bpftrace -e 'BEGIN { printf("Hello eBPF!\n"); }'

La sonde est BEGIN , une sonde spéciale qui s'exécute au début du programme (comme awk). Il n'y a pas de filtre. L'action est un printf() déclaration.

Maintenant un vrai exemple :

# bpftrace -e 'kretprobe:sys_read /pid == 181/ { @bytes = hist(retval); }'

Cela utilise un kretprobe pour instrumenter le retour du sys_read() fonction noyau. Si le PID est 181, une variable de carte spéciale @bytes est rempli avec une fonction d'histogramme log2 avec la valeur de retour retval de sys_read() . Cela produit un histogramme de la taille de lecture renvoyée pour le PID 181. Votre application effectue-t-elle de nombreuses lectures d'un octet ? Peut-être que cela peut être optimisé.

Types de sondes

Ce sont des bibliothèques de sondes apparentées. Les types actuellement pris en charge sont (d'autres seront ajoutés) :

Type Description
point de trace Points d'instrumentation statique du noyau
USD Traçage défini statiquement au niveau de l'utilisateur
kprobe Instrumentation de la fonction dynamique du noyau
kretprobe Instrumentation de retour de fonction dynamique du noyau
uprobe Instrumentation de la fonction dynamique au niveau de l'utilisateur
sonde uret Instrumentation de retour de fonction dynamique au niveau de l'utilisateur
logiciel Événements basés sur le logiciel du noyau
matériel Instrumentation basée sur des compteurs matériels
point de vigilance Événements de point de surveillance de la mémoire (en développement)
profil Échantillonnage chronométré sur tous les processeurs
intervalle Rapports temporisés (à partir d'un processeur)
COMMENCER Démarrage de bpftrace
FIN Fin de bpftrace

    L'instrumentation dynamique (ou traçage dynamique) est la superpuissance qui vous permet de tracer n'importe quelle fonction logicielle dans un binaire en cours d'exécution sans le redémarrer. Cela vous permet d'aller au fond de n'importe quel problème. Cependant, les fonctions qu'il expose ne sont pas considérées comme une API stable, car elles peuvent changer d'une version logicielle à l'autre. D'où l'instrumentation statique, où les points d'événement sont codés en dur et deviennent une API stable. Lorsque vous écrivez des programmes bpftrace, essayez d'abord d'utiliser les types statiques, avant les dynamiques, afin que vos programmes soient plus stables.

    Types de variables

    Variable Description
    @nom mondial
    @nom[clé] hachage
    @nom[tid] thread-local
    $name rayer

      Variables avec un @ préfixe utilise des cartes BPF, qui peuvent se comporter comme des tableaux associatifs. Ils peuvent être renseignés de deux manières :

      • Affectation de variable :@name =x ;
      • Affectation de fonction :@name =hist(x);

      Diverses fonctions de remplissage de carte sont intégrées pour fournir des moyens rapides de résumer les données.

      Variables et fonctions intégrées

      Voici quelques-unes des variables et fonctions intégrées, mais il y en a bien d'autres.

      Variables intégrées :

      Variable Description
      pid ID de processus
      communication Nom du processus ou de la commande
      nsecs Heure actuelle en nanosecondes
      kstack Traçage de la pile du noyau
      ustack Traçage de la pile au niveau de l'utilisateur
      arg0...argN Arguments de fonction
      arguments Arguments de point de trace
      récupération Valeur de retour de la fonction
      nom Nom complet de la sonde

        Fonctions intégrées :

        Fonction Description
        printf("...") Imprimer la chaîne formatée
        heure("...") Imprimer l'heure formatée
        système("...") Exécuter la commande shell
        @ =compte() Compter les événements
        @ =hist(x) Histogramme puissance de 2 pour x
        @ =lhist(x, min, max, pas) Histogramme linéaire pour x

          Consultez le guide de référence pour plus de détails.

          Tutoriel One-liners

          Une excellente façon d'apprendre bpftrace est via des one-liners, que j'ai transformés en un tutoriel one-liner qui couvre ce qui suit :

          Liste des sondes bpftrace -l 'tracepoint:syscalls:sys_enter_*'
          Bonjour tout le monde bpftrace -e 'BEGIN { printf("hello world\n") }'
          Le fichier s'ouvre bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("%s %s\n", comm, str(args->filename)) }'
          Syscall compte par processus bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] =count() }'
          Répartition des octets read() bpftrace -e 'tracepoint:syscalls:sys_exit_read /pid ==18644/ { @bytes =hist(args->retval) }'
          Traçage dynamique du noyau des octets read() bpftrace -e 'kretprobe:vfs_read { @bytes =lhist(retval, 0, 2000, 200) }'
          Lecture temporelle()s bpftrace -e 'kprobe:vfs_read { @start[tid] =nsecs } kretprobe:vfs_read /@start[tid]/ { @ns[comm] =hist(nsecs - @start[tid]); supprimer(@start[tid]) }'
          Compter les événements au niveau du processus bpftrace -e 'tracepoint:sched:sched* { @[name] =count() } interval:s:5 { exit() }'
          Profiler les piles du noyau sur le processeur bpftrace -e 'profile:hz:99 { @[stack] =count() }'
          Suivi du planificateur bpftrace -e 'tracepoint:sched:sched_switch { @[stack] =count() }'
          Bloquer le suivi des E/S bpftrace -e 'tracepoint:block:block_rq_issue { @ =hist(args->bytes); }
          Traçage de structure du noyau (un script, pas une ligne) Commande : bpftrace path.bt , où se trouve le fichier path.bt :



          #include

          #include




          kprobe:vfs_open { printf("open path:%s\n", str(((path *)arg0)->dentry->d_name .Nom)); }

          Voir le didacticiel pour une explication de chacun.

          Outils fournis

          Outre les one-liners, les programmes bpftrace peuvent être des scripts multilignes. Bpftrace est livré avec 28 d'entre eux comme outils :

          Ceux-ci peuvent être trouvés dans /tools répertoire :

          tools# ls *.bt
          bashreadline.bt  dcsnoop.bt         oomkill.bt    syncsnoop.bt   vfscount.bt
          biolatency.bt    execsnoop.bt       opensnoop.bt  syscount.bt    vfsstat.bt
          biosnoop.bt      gethostlatency.bt  pidpersec.bt  tcpaccept.bt   writeback.bt
          bitesize.bt      killsnoop.bt       runqlat.bt    tcpconnect.bt  xfsdist.bt
          capable.bt       loads.bt           runqlen.bt    tcpdrop.bt
          cpuwalk.bt       mdflush.bt         statsnoop.bt  tcpretrans.bt

          Outre leur utilisation dans le diagnostic des problèmes de performances et le dépannage général, ils offrent également un autre moyen d'apprendre bpftrace. Voici quelques exemples.

          Source

          Voici le code de biolatency.bt :

          tools# cat -n biolatency.bt
               1  /*
               2   * biolatency.bt    Block I/O latency as a histogram.
               3   *                  For Linux, uses bpftrace, eBPF.
               4   *
               5   * This is a bpftrace version of the bcc tool of the same name.
               6   *
               7   * Copyright 2018 Netflix, Inc.
               8   * Licensed under the Apache License, Version 2.0 (the "License")
               9   *
              10   * 13-Sep-2018  Brendan Gregg   Created this.
              11   */
              12
              13  BEGIN
              14  {
              15          printf("Tracing block device I/O... Hit Ctrl-C to end.\n");
              16  }
              17
              18  kprobe:blk_account_io_start
              19  {
              20          @start[arg0] = nsecs;
              21  }
              22
              23  kprobe:blk_account_io_done
              24  /@start[arg0]/
              25
              26  {
              27          @usecs = hist((nsecs - @start[arg0]) / 1000);
              28          delete(@start[arg0]);
              29  }
              30 
              31  END
              32  {
              33          clear(@start);
              34  }

          Il est simple, facile à lire et suffisamment court pour être inclus dans une diapositive. Cette version utilise le traçage dynamique du noyau pour instrumenter le blk_account_io_start() et blk_account_io_done() fonctions, et il passe un horodatage entre eux sur arg0 pour chaque. arg0 sur kprobe est le premier argument de cette fonction, qui est la struct request * , et son adresse mémoire est utilisée comme identifiant unique.

          Fichiers d'exemple

          Vous pouvez voir des captures d'écran et des explications de ces outils dans le référentiel GitHub sous la forme *_example.txt des dossiers. Par exemple :

          tools# more biolatency_example.txt
          Demonstrations of biolatency, the Linux BPF/bpftrace version.


          This traces block I/O, and shows latency as a power-of-2 histogram. For example:

          # biolatency.bt
          Attaching 3 probes...
          Tracing block device I/O... Hit Ctrl-C to end.
          ^C

          @usecs:
          [256, 512)             2 |                                                    |
          [512, 1K)             10 |@                                                   |
          [1K, 2K)             426 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|
          [2K, 4K)             230 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@                        |
          [4K, 8K)               9 |@                                                   |
          [8K, 16K)            128 |@@@@@@@@@@@@@@@                                     |
          [16K, 32K)            68 |@@@@@@@@                                            |
          [32K, 64K)             0 |                                                    |
          [64K, 128K)            0 |                                                    |
          [128K, 256K)          10 |@                                                   |

          While tracing, this shows that 426 block I/O had a latency of between 1K and 2K
          usecs (1024 and 2048 microseconds), which is between 1 and 2 milliseconds.
          There are also two modes visible, one between 1 and 2 milliseconds, and another
          between 8 and 16 milliseconds: this sounds like cache hits and cache misses.
          There were also 10 I/O with latency 128 to 256 ms: outliers. Other tools and
          instrumentation, like biosnoop.bt, can shed more light on those outliers.
          [...]

          Parfois, il peut être plus efficace de passer directement au fichier d'exemple lorsque vous essayez de comprendre ces outils, car le résultat peut être évident (de par sa conception !).

          Pages de manuel

          Il existe également des pages de manuel pour chaque outil du dépôt GitHub sous /man/man8. Ils incluent des sections sur les champs de sortie et la surcharge attendue de l'outil.

          # nroff -man man/man8/biolatency.8
          biolatency(8)               System Manager's Manual              biolatency(8)



          NAME
                 biolatency.bt - Block I/O latency as a histogram. Uses bpftrace/eBPF.

          SYNOPSIS
                 biolatency.bt

          DESCRIPTION
                 This  tool  summarizes  time  (latency) spent in block device I/O (disk
                 I/O) as a power-of-2 histogram. This  allows  the  distribution  to  be
                 studied,  including  modes and outliers. There are often two modes, one
                 for device cache hits and one for cache misses, which can be  shown  by
                 this tool. Latency outliers will also be shown.
          [...]

          L'écriture de toutes ces pages de manuel était la partie la moins amusante du développement de ces outils, et certaines ont pris plus de temps à écrire que l'outil n'a pris à se développer, mais c'est agréable de voir le résultat final.

          bpftrace contre BCC

          Depuis qu'eBPF a fusionné dans le noyau, la plupart des efforts ont été concentrés sur l'interface BCC, qui fournit une bibliothèque BPF et des interfaces Python, C++ et Lua pour l'écriture de programmes. J'ai développé de nombreux outils en BCC/Python; cela fonctionne très bien, bien que le codage en BCC soit verbeux. Si vous vous attaquez à un problème de performances, bpftrace est préférable pour vos requêtes personnalisées ponctuelles. Si vous écrivez un outil avec de nombreuses options de ligne de commande ou un agent qui utilise des bibliothèques Python, vous voudrez peut-être envisager d'utiliser BCC.

          Dans l'équipe de performance de Netflix, nous utilisons à la fois :BCC pour développer des outils prêts à l'emploi que d'autres peuvent facilement utiliser et pour développer des agents ; et bpftrace pour une analyse ad hoc. L'équipe d'ingénierie réseau a utilisé BCC pour développer un agent pour ses besoins. L'équipe de sécurité s'intéresse particulièrement à bpftrace pour une instrumentation ad hoc rapide permettant de détecter les vulnérabilités zero-day. Et je m'attends à ce que les équipes de développeurs utilisent les deux sans le savoir, via les interfaces graphiques en libre-service que nous construisons (Vector), et occasionnellement peuvent SSH dans une instance et exécuter un outil prédéfini ou ad hoc bpftrace one-liner.

          En savoir plus

          • Le référentiel bpftrace sur GitHub
          • Tutoriel sur les lignes simples de bpftrace
          • Le guide de référence bpftrace
          • Le référentiel BCC pour les outils plus complexes basés sur BPF

          J'ai également un livre qui sort cette année et qui traite de bpftrace :BPF Performance Tools :Linux System and Application Observability , qui sera publié par Addison Wesley, et qui contient de nombreux nouveaux outils bpftrace.


          Merci à Alastair Robertson pour la création de bpftrace, et aux communautés bpftrace, BCC et BPF pour tout le travail effectué au cours des cinq dernières années.


          Linux
          1. Commandes FreeDOS pour les fans de Linux

          2. Introduction à Nmap sur Kali Linux

          3. 10 commandes Linux pour les diagnostics réseau

          4. Une introduction aux pare-feu d'applications Web pour les administrateurs système Linux

          5. Une brève introduction aux rôles Ansible pour l'administration système Linux

          Meilleures distributions pour les jeux sur Linux

          25 livres gratuits pour apprendre Linux gratuitement

          Introduction à la gestion des conteneurs Linux

          Une introduction rapide au système de fichiers Linux pour les utilisateurs de Windows.

          Une introduction à Cockpit, un outil d'administration basé sur un navigateur pour Linux

          Zorin OS pour les débutants Linux