Collection du compilateur BPF (BCC)
BCC est une boîte à outils permettant de créer des programmes efficaces de traçage et de manipulation du noyau et comprend plusieurs outils et exemples utiles. Il utilise le BPF étendu (Berkeley Packet Filters), anciennement connu sous le nom d'eBPF, une nouvelle fonctionnalité qui a été ajoutée pour la première fois à Linux 3.15. Une grande partie de ce que BCC utilise nécessite Linux 4.1 et supérieur.
L'eBPF a été décrit par Ingo Molnár comme :
L'une des fonctionnalités les plus intéressantes de ce cycle est la possibilité d'attacher des programmes eBPF (bytecode défini par l'utilisateur et exécuté par le noyau) aux kprobes. Cela permet une instrumentation définie par l'utilisateur sur une image du noyau en direct qui ne peut jamais planter, se bloquer ou interférer négativement avec le noyau.
BCC facilite l'écriture des programmes BPF, avec une instrumentation du noyau en C (et inclut un wrapper C autour de LLVM) et des frontaux en Python et Lua. Il convient à de nombreuses tâches, notamment l'analyse des performances et le contrôle du trafic réseau.
Capture d'écran
Cet exemple trace une fonction du noyau d'E/S de disque et remplit un histogramme puissance de 2 dans le noyau de la taille des E/S. Pour des raisons d'efficacité, seul le résumé de l'histogramme est renvoyé au niveau de l'utilisateur.
# ./bitehist.py
Tracing... Hit Ctrl-C to end.
^C
kbytes : count distribution
0 - > 1 : 3 | |
2 - > 3 : 0 | |
4 - > 7 : 211 | ********** |
8 - > 15 : 0 | |
16 - > 31 : 0 | |
32 - > 63 : 0 | |
64 - > 127 : 1 | |
128 - > 255 : 800 | ************************************** |
La sortie ci-dessus montre une distribution bimodale, où le mode le plus important de 800 E/S avait une taille comprise entre 128 et 255 Ko.
Voir la source : bitehist.py. Ce que cela trace, ce que cela stocke et la manière dont les données sont présentées peuvent être entièrement personnalisés. Cela ne montre que quelques-unes des nombreuses capacités possibles.
Installation
Voir INSTALL.md pour les étapes d'installation sur votre plate-forme.
FAQ
Consultez le fichier FAQ.txt pour connaître les questions de dépannage les plus courantes.
Guide de référence
Voir docs/reference_guide.md pour le guide de référence des API bcc et bcc/BPF.
Contenu
Certains d'entre eux sont des fichiers uniques contenant à la fois C et Python, d'autres contiennent une paire de fichiers .c et .py, et certains sont des répertoires de fichiers.
Tracé
Exemples
- examples/tracing/bitehist.py : histogramme de la taille des E/S du bloc. Exemples.
- examples/tracing/disksnoop.py : trace la latence d'E/S du périphérique de bloc. Exemples.
- examples/hello_world.py : affiche "Bonjour, le monde !" pour les nouveaux procédés.
- examples/tracing/mysqld_query.py : suivez les requêtes du serveur MySQL à l'aide de sondes USDT. Exemples.
- examples/tracing/nodejs_http_server.py : tracez les requêtes du serveur HTTP Node.js à l'aide de sondes USDT. Exemples.
- examples/tracing/stacksnoop : tracez une fonction du noyau et imprimez toutes les traces de la pile du noyau. Exemples.
- tools/statsnoop : trace les appels système stat(). Exemples.
- examples/tracing/task_switch.py : compte les commutateurs de tâches avec les PID de et vers.
- examples/tracing/tcpv4connect.py : trace les connexions actives TCP IPv4. Exemples.
- examples/tracing/trace_fields.py : exemple simple d'impression de champs à partir d'événements tracés.
- examples/tracing/undump.py : vider les paquets de socket UNIX. Exemples
- examples/tracing/urandomread.py : un exemple de point de trace du noyau, qui trace random:urandom_read. Exemples.
- examples/tracing/vfsreadlat.py examples/tracing/vfsreadlat.c : distribution de la latence de lecture VFS. Exemples.
- examples/tracing/kvm_hypercall.py : points de trace statiques conditionnels du noyau pour les exemples d'entrée, de sortie et d'hypercall KVM.
Outils
- tools/argdist : affiche les valeurs des paramètres de fonction sous forme d'histogramme ou de nombre de fréquences. Exemples.
- tools/bashreadline : imprime les commandes bash saisies dans tout le système. Exemples.
- tools/bpflist : affichez les processus avec des programmes et des cartes BPF actifs. Exemples.
- outils/capables : tracez les contrôles des capacités de sécurité. Exemples.
- tools/compactsnoop : tracez les événements de zone compacte avec PID et latence. Exemples.
- tools/criticalstat : tracez et signalez les longues sections atomiques critiques dans le noyau. Exemples
- tools/deadlock : Détectez les blocages potentiels sur un processus en cours d’exécution. Exemples.
- tools/drsnoop : tracez les événements de récupération directe avec le PID et la latence. Exemples.
- tools/funccount : compte les appels de fonctions du noyau. Exemples.
- tools/inject : injection d'erreurs ciblée avec chaîne d'appels et exemples de prédicats.
- tools/klockstat : trace les événements de verrouillage mutex du noyau et affiche les statistiques de verrouillage. Exemples.
- tools/opensnoop : trace les appels système open(). Exemples.
- tools/readahead : Afficher les performances du cache en lecture anticipée. Exemples.
- tools/reset-trace : Réinitialise l’état du traçage. Outil d'entretien uniquement. Exemples.
- tools/stackcount : compte les appels de fonctions du noyau et leurs traces de pile. Exemples.
- tools/syncsnoop : tracez l'appel système sync(). Exemples.
- tools/threadsnoop : répertorie les créations de nouveaux threads. Exemples.
- tools/tplist : affiche les points de trace du noyau ou les sondes USDT et leurs formats. Exemples.
- tools/trace : tracez des fonctions arbitraires, avec des filtres. Exemples.
- tools/ttysnoop : regardez la sortie en direct d'un appareil tty ou pts. Exemples.
- tools/ucalls : résumer les appels de méthode ou les appels système Linux dans des langages de haut niveau. Exemples.
- tools/uflow : imprime un graphique de flux de méthode dans des langages de haut niveau. Exemples.
- tools/ugc : tracez les événements de garbage collection dans les langages de haut niveau. Exemples.
- tools/uobjnew : résumez les événements d'allocation d'objet par type d'objet et nombre d'octets alloués. Exemples.
- tools/ustat : collectez des événements tels que les GC, les créations de threads, les allocations d'objets, les exceptions et plus encore dans des langages de haut niveau. Exemples.
- tools/uthreads : tracez les événements de création de threads en Java et les pthreads bruts. Exemples.
Outils de mémoire et de processus
- tools/execsnoop : tracez les nouveaux processus via les appels système exec(). Exemples.
- tools/exitsnoop : terminaison du processus de trace (signaux de sortie et fatals). Exemples.
- tools/killsnoop : signaux de trace émis par l'appel système kill(). Exemples.
- tools/kvmexit : Affichez le exit_reason et ses statistiques de chaque sortie de vm. Exemples.
- tools/memleak : affiche les allocations de mémoire exceptionnelles pour rechercher les fuites de mémoire. Exemples.
- tools/oomkill : tracez le tueur de manque de mémoire (MOO). Exemples.
- tools/pidpersec : Compter les nouveaux processus (via fork). Exemples.
- tools/rdmaucma : tracez les événements d'accès au gestionnaire de connexion de l'espace utilisateur RDMA. Exemples.
- tools/shmsnoop : trace les appels système à mémoire partagée du System V. Exemples.
- tools/slabratetop : taux d'allocation de cache mémoire du noyau SLAB/SLUB supérieur. Exemples.
Outils de performance et de temps
- tools/dbslower : trace les requêtes MySQL/PostgreSQL plus lentement qu'un seuil. Exemples.
- tools/dbstat : résume la latence des requêtes MySQL/PostgreSQL sous forme d'histogramme. Exemples.
- tools/funcinterval : Intervalle de temps entre la même fonction qu'un histogramme. Exemples.
- outils/fonctionnalités : fonctions temporelles et affichage de leur distribution de latence. Exemples.
- tools/funcslower : trace les appels lents du noyau ou des fonctions utilisateur. Exemples.
- tools/hardirqs : mesure le temps de l'événement hard IRQ (interruption dure). Exemples.
- tools/mysqld_qslower : trace les requêtes du serveur MySQL plus lentement qu'un seuil. Exemples.
- tools/ppchcalls : résumez le nombre et les latences d'appels ppc. Exemples.
- tools/softirqs : mesurez le temps de l'événement soft IRQ (interruption logicielle). Exemples.
- tools/syscount : résumez le nombre d’appels système et les latences. Exemples.
Outils CPU et planificateur
- tools/cpudist : résumez le temps passé et hors CPU par tâche sous forme d'histogramme. Exemples
- tools/cpuunclaimed : échantillonnez les files d'attente d'exécution du processeur et calculez le processeur inactif non réclamé. Exemples
- tools/llcstat : résume les références de cache du processeur et les échecs par processus. Exemples.
- tools/offcputime : résume le temps hors CPU par trace de la pile du noyau. Exemples.
- tools/offwaketime : résume le temps bloqué par la pile hors CPU du noyau et la pile waker. Exemples.
- outils/profil : profilez l'utilisation du processeur en échantillonnant les traces de pile à un intervalle de temps. Exemples.
- tools/runqlat : latence de la file d'attente d'exécution (planificateur) sous forme d'histogramme. Exemples.
- tools/runqlen : exécutez la longueur de la file d'attente sous forme d'histogramme. Exemples.
- tools/runqslower : tracez les longs retards de planification des processus. Exemples.
- tools/wakeuptime : résumez l'heure de veille à l'heure de réveil par pile du noyau waker. Exemples.
- tools/wqlat : résume la latence d'attente du travail dans la file d'attente. Exemples.
Outils réseau et sockets
- tools/gethostlatency : affiche la latence pour les appels getaddrinfo/gethostbyname[2]. Exemples.
- tools/bindsnoop : trace les appels système bind() IPv4 et IPv6 (bind()). Exemples.
- tools/netqtop tools/netqtop.c : trace et affiche la distribution des paquets sur les files d'attente de la carte réseau. Exemples.
- tools/sofdsnoop : Tracez les FD transmis via les sockets Unix. Exemples.
- tools/solisten : Tracez l'écoute du socket TCP. Exemples.
- tools/sslsniff : Renifle les données écrites et lues par OpenSSL. Exemples.
- tools/tcpaccept : Trace les connexions passives TCP (accept()). Exemples.
- tools/tcpconnect : trace les connexions TCP actives (connect()). Exemples.
- tools/tcpconnlat : trace la latence de connexion active TCP (connect()). Exemples.
- tools/tcpdrop : tracez les pertes de paquets TCP basées sur le noyau avec des détails. Exemples.
- tools/tcplife : tracez les sessions TCP et résumez la durée de vie. Exemples.
- tools/tcpretrans : tracez les retransmissions TCP et les TLP. Exemples.
- tools/tcprtt : trace le temps d'aller-retour TCP. Exemples.
- tools/tcpstates : tracez les changements d’état de session TCP avec les durées. Exemples.
- tools/tcpsubnet : résumer et regrouper les envois TCP par sous-réseau. Exemples.
- tools/tcpsynbl : affiche le backlog TCP SYN. Exemples.
- tools/tcptop : résume le débit d'envoi/réception TCP par hôte. Top pour TCP. Exemples.
- tools/tcptracer : trace les connexions TCP établies (connect(), accept(), close()). Exemples.
- tools/tcpcong : trace la durée de l'état du contrôle de congestion du socket TCP. Exemples.
Outils de stockage et de systèmes de fichiers
- tools/bitesize : affiche l'histogramme de la taille des E/S par processus. Exemples.
- tools/cachestat : taux de réussite/échec du cache de page de trace. Exemples.
- tools/cachetop : tracez le taux de réussite/échec du cache de page par processus. Exemples.
- tools/dcsnoop : trace les recherches dans le cache d'entrées de répertoire (dcache). Exemples.
- tools/dcstat : statistiques du cache d'entrées de répertoire (dcache). Exemples.
- outils/biolatence : résumez la latence d'E/S du périphérique bloc sous forme d'histogramme. Exemples.
- tools/biotop : Top pour les disques : résume les E/S des périphériques bloqués par processus. Exemples.
- outils/biomodèle : identifiez les modèles d’accès au disque aléatoires/séquentiels. Exemples.
- tools/biosnoop : tracez les E/S du périphérique de bloc avec le PID et la latence. Exemples.
- tools/dirtop : lecture et écriture du fichier par répertoire. Top pour les annuaires. Exemples.
- tools/filelife : suivez la durée de vie des fichiers de courte durée. Exemples.
- tools/filegone : tracez pourquoi le fichier a disparu (supprimé ou renommé). Exemples.
- tools/fileslower : trace les lectures et écritures de fichiers synchrones lentes. Exemples.
- tools/filetop : lectures et écritures de fichiers par nom de fichier et processus. Top pour les fichiers. Exemples.
- tools/mdflush : trace les événements de vidage md. Exemples.
- tools/mountsnoop : trace les appels système de montage et d'umount à l'échelle du système. Exemples.
- tools/virtiostat : affiche les statistiques d'E/S du périphérique VIRTIO. Exemples.
Outils de systèmes de fichiers
- tools/btrfsdist : résume la distribution de la latence des opérations btrfs sous forme d'histogramme. Exemples.
- tools/btrfsslower : trace les opérations btrfs lentes. Exemples.
- tools/ext4dist : résume la distribution de la latence des opérations ext4 sous forme d'histogramme. Exemples.
- tools/ext4slower : trace les opérations ext4 lentes. Exemples.
- tools/nfsslower : trace les opérations NFS lentes. Exemples.
- tools/nfsdist : résume la distribution de la latence des opérations NFS sous forme d'histogramme. Exemples.
- tools/vfscount : compte les appels VFS. Exemples.
- tools/vfsstat : comptez certains appels VFS, avec sortie en colonne. Exemples.
- tools/xfsdist : résume la distribution de la latence des opérations XFS sous forme d'histogramme. Exemples.
- tools/xfsslower : trace les opérations XFS lentes. Exemples.
- tools/zfsdist : résume la distribution de la latence des opérations ZFS sous forme d'histogramme. Exemples.
- tools/zfsslower : trace les opérations ZFS lentes. Exemples.
Réseautage
Exemples :
- examples/networking/distributed_bridge/ : exemple de pont distribué.
- examples/networking/http_filter/ : exemple de filtre HTTP simple.
- examples/networking/simple_tc.py : exemple simple de contrôle du trafic.
- examples/networking/simulation.py : assistant de simulation.
- examples/networking/neighbor_sharing/tc_neighbor_sharing.py examples/networking/neighbor_sharing/tc_neighbor_sharing.c : classification par IP et limitation de débit.
- examples/networking/tunnel_monitor/ : surveillez efficacement les flux de trafic.
- examples/networking/vlan_learning/vlan_learning.py examples/vlan_learning.c : démultiplexage du trafic Ethernet dans les espaces de noms veth+des travailleurs.
Introspection BPF
Des outils qui aident à introspecter les programmes BPF.
- introspection/bps.c : répertorie tous les programmes BPF chargés dans le noyau. 'ps' pour les programmes BPF. Exemples.
Motivation
BPF garantit que les programmes chargés dans le noyau ne peuvent pas planter et ne peuvent pas s'exécuter indéfiniment, mais BPF est néanmoins suffisamment général pour effectuer de nombreux types de calculs arbitraires. Actuellement, il est possible d'écrire un programme en C qui se compilera en un programme BPF valide, mais il est beaucoup plus facile d'écrire un programme C qui se compilera en un programme BPF invalide (C est comme ça). L'utilisateur ne saura pas avant d'essayer d'exécuter le programme s'il était valide ou non.
Avec un frontend spécifique à BPF, on devrait pouvoir écrire dans un langage et recevoir des commentaires du compilateur sur la validité en ce qui concerne un backend BPF. Cette boîte à outils vise à fournir une interface capable de créer uniquement des programmes BPF valides tout en exploitant toute sa flexibilité.
De plus, les intégrations actuelles avec BPF ont un flux de travail compliqué, impliquant parfois une compilation directement dans une arborescence des sources du noyau Linux. Cette chaîne d'outils vise à minimiser le temps qu'un développeur passe à compiler BPF et à se concentrer plutôt sur les applications qui peuvent être écrites et les problèmes qui peuvent être résolus avec BPF.
Les fonctionnalités de cette boîte à outils incluent :
- Workflow BPF de bout en bout dans une bibliothèque partagée
- Un langage C modifié pour les backends BPF
- Intégration avec le backend llvm-bpf pour JIT
- (Dé)chargement dynamique des programmes JITed
- Prise en charge des hooks du noyau BPF : filtres de socket, classificateurs tc, actions tc et kprobes
- Liaisons pour Python
- Exemples de filtres de socket, de classificateurs TC et de kprobes
- Outils autonomes pour tracer un système en cours d'exécution
À l'avenir, d'autres liaisons que Python seront probablement prises en charge. N'hésitez pas à ajouter le support pour la langue de votre choix et à envoyer une pull request !
Tutoriels
- docs/tutorial.md : utilisation des outils Cci pour résoudre les problèmes de performances, de dépannage et de mise en réseau.
- docs/tutorial_bcc_python_developer.md : Développement de nouveaux programmes BCC à l'aide de l'interface Python.
Réseautage
Lors du Red Hat Summit 2015, BCC a été présenté dans le cadre d'une session sur BPF. Un environnement vxlan multi-hôtes est simulé et un programme BPF utilisé pour surveiller l'une des interfaces physiques. Le programme BPF conserve des statistiques sur les adresses IP internes et externes traversant l'interface, et le composant espace utilisateur transforme ces statistiques en un graphique montrant la répartition du trafic à plusieurs granularités. Voir le code ici.
Contribuer
Déjà motivé à valider du code ? Voici quelques ressources pour rejoindre les discussions de la communauté IOVisor et voir sur quoi vous souhaitez travailler.
- Liste de diffusion : https://lists.iovisor.org/mailman/listinfo/iovisor-dev
- IRC : #iovisor sur irc.oftc.net
- Suivi des problèmes BCC : problèmes Github
- Un guide pour contribuer aux scripts : CONTRIBUTING-SCRIPTS.md
Liens externes
Vous recherchez plus d’informations sur BCC et comment il est utilisé ? Vous pouvez trouver des liens vers d’autres contenus BCC sur le Web dans LINKS.md.