BPF-Compiler-Sammlung (BCC)
BCC ist ein Toolkit zum Erstellen effizienter Programme zur Kernel-Ablaufverfolgung und -Manipulation und enthält mehrere nützliche Tools und Beispiele. Es nutzt erweiterte BPF (Berkeley Packet Filters), früher bekannt als eBPF, eine neue Funktion, die erstmals zu Linux 3.15 hinzugefügt wurde. Vieles, was BCC verwendet, erfordert Linux 4.1 und höher.
eBPF wurde von Ingo Molnár beschrieben als:
Eine der interessanteren Funktionen in diesem Zyklus ist die Möglichkeit, eBPF-Programme (benutzerdefinierter, vom Kernel ausgeführter Sandbox-Bytecode) an kprobes anzuhängen. Dies ermöglicht eine benutzerdefinierte Instrumentierung auf einem Live-Kernel-Image, das niemals abstürzen, hängen bleiben oder den Kernel negativ beeinflussen kann.
BCC erleichtert das Schreiben von BPF-Programmen mit Kernel-Instrumentierung in C (und enthält einen C-Wrapper um LLVM) und Frontends in Python und Lua. Es eignet sich für viele Aufgaben, einschließlich Leistungsanalyse und Netzwerkverkehrskontrolle.
Screenshot
In diesem Beispiel wird eine Festplatten-E/A-Kernelfunktion verfolgt und ein 2er-Potenz-Histogramm der E/A-Größe im Kernel ausgefüllt. Aus Effizienzgründen wird nur die Histogrammzusammenfassung auf Benutzerebene zurückgegeben.
# ./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 | ************************************** |
Die obige Ausgabe zeigt eine bimodale Verteilung, wobei der größte Modus mit 800 E/A zwischen 128 und 255 KB groß war.
Siehe die Quelle: bitehist.py. Was dabei verfolgt, was gespeichert wird und wie die Daten dargestellt werden, kann vollständig angepasst werden. Dies zeigt nur einige der vielen möglichen Fähigkeiten.
Installieren
Siehe INSTALL.md für Installationsschritte auf Ihrer Plattform.
FAQ
Die häufigsten Fragen zur Fehlerbehebung finden Sie in der Datei FAQ.txt.
Referenzhandbuch
Das Referenzhandbuch zu den APIs bcc und bcc/BPF finden Sie unter docs/reference_guide.md.
Inhalt
Bei einigen davon handelt es sich um einzelne Dateien, die sowohl C als auch Python enthalten, bei anderen handelt es sich um ein Paar aus .c- und .py-Dateien, und bei einigen handelt es sich um Dateiverzeichnisse.
Nachverfolgung
Beispiele
- examples/tracing/bitehist.py: Histogramm der Block-E/A-Größe. Beispiele.
- examples/tracing/disksnoop.py: I/O-Latenz von Blockgeräten verfolgen. Beispiele.
- examples/hello_world.py: Gibt „Hello, World!“ aus. für neue Prozesse.
- examples/tracing/mysqld_query.py: Verfolgen Sie MySQL-Serverabfragen mithilfe von USDT-Probes. Beispiele.
- examples/tracing/nodejs_http_server.py: Verfolgen Sie HTTP-Serveranforderungen von Node.js mithilfe von USDT-Probes. Beispiele.
- Beispiele/tracing/stacksnoop: Verfolgen Sie eine Kernelfunktion und drucken Sie alle Kernel-Stack-Traces aus. Beispiele.
- tools/statsnoop: stat()-Systemaufrufe verfolgen. Beispiele.
- examples/tracing/task_switch.py: Aufgabenwechsel mit Von- und Zu-PIDs zählen.
- examples/tracing/tcpv4connect.py: Verfolgen Sie aktive TCP-IPv4-Verbindungen. Beispiele.
- examples/tracing/trace_fields.py: Einfaches Beispiel für das Drucken von Feldern aus verfolgten Ereignissen.
- examples/tracing/undump.py: UNIX-Socket-Pakete ausgeben. Beispiele
- examples/tracing/urandomread.py: Ein Kernel-Tracepoint-Beispiel, das random:urandom_read verfolgt. Beispiele.
- examples/tracing/vfsreadlat.py examples/tracing/vfsreadlat.c: VFS-Leselatenzverteilung. Beispiele.
- Beispiele/tracing/kvm_hypercall.py: Bedingte statische Kernel-Tracepoints für KVM-Eintritt, -Austritt und Hypercall-Beispiele.
Werkzeuge
- tools/argdist: Funktionsparameterwerte als Histogramm oder Häufigkeitszählung anzeigen. Beispiele.
- tools/bashreadline: Eingegebene Bash-Befehle systemweit drucken. Beispiele.
- tools/bpflist: Prozesse mit aktiven BPF-Programmen und Karten anzeigen. Beispiele.
- tools/capable: Überprüfungen der Sicherheitsfähigkeit verfolgen. Beispiele.
- tools/compactsnoop: Kompaktzonenereignisse mit PID und Latenz verfolgen. Beispiele.
- tools/criticalstat: Verfolgen und melden Sie lange, atomar kritische Abschnitte im Kernel. Beispiele
- Tools/Deadlock: Erkennen Sie potenzielle Deadlocks in einem laufenden Prozess. Beispiele.
- tools/drsnoop: Verfolgen Sie direkte Rückforderungsereignisse mit PID und Latenz. Beispiele.
- tools/funccount: Kernel-Funktionsaufrufe zählen. Beispiele.
- tools/inject: Gezielte Fehlerinjektion mit Aufrufkette und Prädikaten. Beispiele.
- tools/klockstat: Verfolgt Kernel-Mutex-Sperrereignisse und zeigt Sperrstatistiken an. Beispiele.
- tools/opensnoop: open()-Systemaufrufe verfolgen. Beispiele.
- tools/readahead: Beispiele für die Leistung des Read-Ahead-Cache anzeigen.
- tools/reset-trace: Setzen Sie den Status der Ablaufverfolgung zurück. Nur Wartungswerkzeug. Beispiele.
- tools/stackcount: Zählt Kernel-Funktionsaufrufe und ihre Stack-Traces. Beispiele.
- tools/syncsnoop: sync()-Systemaufruf verfolgen. Beispiele.
- tools/threadsnoop: Neue Thread-Erstellung auflisten. Beispiele.
- tools/tplist: Zeigt Kernel-Tracepoints oder USDT-Probes und deren Formate an. Beispiele.
- tools/trace: Beliebige Funktionen mit Filtern verfolgen. Beispiele.
- tools/ttysnoop: Live-Ausgabe von einem TTY- oder PTS-Gerät ansehen. Beispiele.
- tools/ucalls: Methodenaufrufe oder Linux-Systemaufrufe in Hochsprachen zusammenfassen. Beispiele.
- tools/uflow: Drucken Sie ein Methodenflussdiagramm in Hochsprachen. Beispiele.
- tools/ugc: Garbage-Collection-Ereignisse in Hochsprachen verfolgen. Beispiele.
- tools/uobjnew: Fassen Sie Objektzuweisungsereignisse nach Objekttyp und Anzahl der zugewiesenen Bytes zusammen. Beispiele.
- tools/ustat: Sammeln Sie Ereignisse wie GCs, Thread-Erstellung, Objektzuweisungen, Ausnahmen und mehr in Hochsprachen. Beispiele.
- tools/uthreads: Verfolgen Sie Thread-Erstellungsereignisse in Java und rohe Pthreads. Beispiele.
Speicher- und Prozesswerkzeuge
- tools/execsnoop: Verfolgen Sie neue Prozesse über exec()-Systemaufrufe. Beispiele.
- tools/exitsnoop: Prozessbeendigung verfolgen (Exit- und Fatal-Signale). Beispiele.
- tools/killsnoop: Vom Systemaufruf kill() ausgegebene Signale verfolgen. Beispiele.
- tools/kvmexit: Zeigt den „exit_reason“ und seine Statistiken für jeden VM-Exit an. Beispiele.
- tools/memleak: Ausstehende Speicherzuweisungen anzeigen, um Speicherlecks zu finden. Beispiele.
- tools/oomkill: Verfolgen Sie den Out-of-Memory (OOM)-Killer. Beispiele.
- tools/pidpersec: Neue Prozesse zählen (über Fork). Beispiele.
- tools/rdmaucma: RDMA Userspace Connection Manager Access-Ereignisse verfolgen. Beispiele.
- tools/shmsnoop: Systemaufrufe des gemeinsam genutzten Speichers von System V verfolgen. Beispiele.
- tools/slabratetop: Kernel-SLAB/SLUB-Speicher-Cache-Zuweisungsrate oben. Beispiele.
Leistungs- und Zeittools
- tools/dbslower: MySQL/PostgreSQL-Abfragen verfolgen, die langsamer als ein Schwellenwert sind. Beispiele.
- tools/dbstat: Fassen Sie die MySQL/PostgreSQL-Abfragelatenz als Histogramm zusammen. Beispiele.
- tools/funcinterval: Zeitintervall zwischen derselben Funktion als Histogramm. Beispiele.
- tools/funclatency: Zeitfunktionen und Anzeige ihrer Latenzverteilung. Beispiele.
- tools/funcslower: Verfolgen Sie langsame Kernel- oder Benutzerfunktionsaufrufe. Beispiele.
- tools/hardirqs: Messen Sie die Ereigniszeit eines harten IRQ (Hard Interrupt). Beispiele.
- tools/mysqld_qslower: MySQL-Serverabfragen verfolgen, die langsamer als ein Schwellenwert sind. Beispiele.
- tools/ppchcalls: Fasst die Anzahl und Latenzen von PPC-Hcalls zusammen. Beispiele.
- tools/softirqs: Messen Sie die Soft-IRQ-Ereigniszeit (Soft-Interrupt). Beispiele.
- tools/syscount: Fasst die Anzahl der Systemaufrufe und Latenzen zusammen. Beispiele.
CPU- und Scheduler-Tools
- tools/cpudist: Fasst die On- und Off-CPU-Zeit pro Aufgabe als Histogramm zusammen. Beispiele
- tools/cpuunclaimed: Probieren Sie CPU-Ausführungswarteschlangen aus und berechnen Sie die nicht beanspruchte inaktive CPU. Beispiele
- tools/llcstat: CPU-Cache-Referenzen und Fehler nach Prozess zusammenfassen. Beispiele.
- tools/offcputime: Fasst die Zeit außerhalb der CPU anhand des Kernel-Stack-Trace zusammen. Beispiele.
- tools/offwaketime: Fasst die blockierte Zeit nach Kernel-Off-CPU-Stack und Waker-Stack zusammen. Beispiele.
- tools/profile: Erstellen Sie ein Profil zur CPU-Auslastung, indem Sie Stack-Traces in einem bestimmten Zeitintervall abfragen. Beispiele.
- tools/runqlat: Warteschlangenlatenz (Scheduler) als Histogramm ausführen. Beispiele.
- tools/runqlen: Warteschlangenlänge als Histogramm ausführen. Beispiele.
- tools/runqslower: Verfolgen Sie lange Verzögerungen bei der Prozessplanung. Beispiele.
- tools/wakeuptime: Fasst die Schlaf- und Weckzeit nach Waker-Kernel-Stack zusammen. Beispiele.
- tools/wqlat: Fasst die Arbeitswartezeit in der Arbeitswarteschlange zusammen. Beispiele.
Netzwerk- und Sockets-Tools
- tools/gethostlatency: Latenz für getaddrinfo/gethostbyname[2]-Aufrufe anzeigen. Beispiele.
- tools/bindsnoop: IPv4- und IPv6-bind()-Systemaufrufe verfolgen (bind()). Beispiele.
- tools/netqtop tools/netqtop.c: Paketverteilung in NIC-Warteschlangen verfolgen und anzeigen. Beispiele.
- tools/sofdsnoop: Über Unix-Sockets weitergeleitete FDs verfolgen. Beispiele.
- tools/solisten: TCP-Socket-Listen verfolgen. Beispiele.
- tools/sslsniff: Sniff OpenSSL geschriebene und gelesene Daten. Beispiele.
- tools/tcpaccept: Passive TCP-Verbindungen verfolgen (accept()). Beispiele.
- tools/tcpconnect: Aktive TCP-Verbindungen verfolgen (connect()). Beispiele.
- tools/tcpconnlat: Verfolgen Sie die aktive TCP-Verbindungslatenz (connect()). Beispiele.
- tools/tcpdrop: Verfolgen Sie Kernel-basierte TCP-Paketverluste mit Details. Beispiele.
- tools/tcplife: Verfolgen Sie TCP-Sitzungen und fassen Sie die Lebensdauer zusammen. Beispiele.
- tools/tcpretrans: Verfolgen Sie TCP-Neuübertragungen und TLPs. Beispiele.
- tools/tcprtt: TCP-Roundtripzeit verfolgen. Beispiele.
- tools/tcpstates: Verfolgen Sie TCP-Sitzungsstatusänderungen mit Dauer. Beispiele.
- tools/tcpsubnet: Fasst TCP-Sendungen nach Subnetz zusammen und aggregiert sie. Beispiele.
- tools/tcpsynbl: TCP-SYN-Rückstand anzeigen. Beispiele.
- tools/tcptop: Fasst den TCP-Sende-/Empfangsdurchsatz nach Host zusammen. Top für TCP. Beispiele.
- tools/tcptracer: Über TCP hergestellte Verbindungen verfolgen (connect(), Accept(), Close()). Beispiele.
- tools/tcpcong: Verfolgen Sie die Statusdauer der TCP-Socket-Überlastungskontrolle. Beispiele.
Speicher- und Dateisystem-Tools
- tools/bitesize: I/O-Größen-Histogramm pro Prozess anzeigen. Beispiele.
- tools/cachestat: Seiten-Cache-Hit/Miss-Verhältnis verfolgen. Beispiele.
- tools/cachetop: Seiten-Cache-Hit/Miss-Verhältnis nach Prozessen verfolgen. Beispiele.
- tools/dcsnoop: Verzeichniseintrag-Cache-Suchen (dcache) verfolgen. Beispiele.
- tools/dcstat: Statistiken zum Verzeichniseintrag-Cache (dcache). Beispiele.
- Tools/Biolatenz: Fassen Sie die E/A-Latenz von Blockgeräten als Histogramm zusammen. Beispiele.
- tools/biotop: Oben für Festplatten: Blockgeräte-E/A nach Prozess zusammenfassen. Beispiele.
- Tools/Biomuster: Identifizieren Sie zufällige/sequentielle Festplattenzugriffsmuster. Beispiele.
- tools/biosnoop: Blockgeräte-E/A mit PID und Latenz verfolgen. Beispiele.
- tools/dirtop: Datei liest und schreibt nach Verzeichnis. Top für Verzeichnisse. Beispiele.
- tools/filelife: Verfolgen Sie die Lebensdauer kurzlebiger Dateien. Beispiele.
- tools/filegone: Verfolgen Sie, warum die Datei verschwunden ist (gelöscht oder umbenannt). Beispiele.
- tools/fileslower: Verfolgen Sie langsame synchrone Dateilese- und -schreibvorgänge. Beispiele.
- tools/filetop: Datei liest und schreibt nach Dateiname und Prozess. Oben für Dateien. Beispiele.
- tools/mdflush: MD-Flush-Ereignisse verfolgen. Beispiele.
- tools/mountsnoop: Verfolgen Sie Mount- und Umount-Systemaufrufe systemweit. Beispiele.
- tools/virtiostat: E/A-Statistiken des VIRTIO-Geräts anzeigen. Beispiele.
Dateisystem-Tools
- tools/btrfsdist: Fassen Sie die Latenzverteilung des Btrfs-Vorgangs als Histogramm zusammen. Beispiele.
- tools/btrfsslower: Verfolgen Sie langsame Btrfs-Vorgänge. Beispiele.
- tools/ext4dist: Fassen Sie die Latenzverteilung des ext4-Vorgangs als Histogramm zusammen. Beispiele.
- tools/ext4slower: Verfolgen Sie langsame ext4-Vorgänge. Beispiele.
- tools/nfsslower: Verfolgen Sie langsame NFS-Vorgänge. Beispiele.
- tools/nfsdist: Fassen Sie die Latenzverteilung des NFS-Vorgangs als Histogramm zusammen. Beispiele.
- tools/vfscount: VFS-Aufrufe zählen. Beispiele.
- tools/vfsstat: Zählt einige VFS-Aufrufe mit Spaltenausgabe. Beispiele.
- tools/xfsdist: Fassen Sie die Latenzverteilung des XFS-Vorgangs als Histogramm zusammen. Beispiele.
- tools/xfsslower: Verfolgen Sie langsame XFS-Vorgänge. Beispiele.
- tools/zfsdist: ZFS-Vorgangslatenzverteilung als Histogramm zusammenfassen. Beispiele.
- tools/zfsslower: Verfolgen Sie langsame ZFS-Vorgänge. Beispiele.
Vernetzung
Beispiele:
- examples/networking/distributed_bridge/: Beispiel für eine verteilte Bridge.
- examples/networking/http_filter/: Einfaches HTTP-Filterbeispiel.
- examples/networking/simple_tc.py: Einfaches Beispiel für die Verkehrssteuerung.
- examples/networking/simulation.py: Simulationshelfer.
- examples/networking/neighbor_sharing/tc_neighbor_sharing.py examples/networking/neighbor_sharing/tc_neighbor_sharing.c: IP-Klassifizierung und Ratenbegrenzung.
- examples/networking/tunnel_monitor/: Verkehrsströme effizient überwachen.
- examples/networking/vlan_learning/vlan_learning.py examples/vlan_learning.c: Demuxen Sie den Ethernet-Verkehr in Worker-Veth+Namespaces.
BPF-Selbstbeobachtung
Tools, die bei der Selbstprüfung von BPF-Programmen helfen.
- introspection/bps.c: Listet alle in den Kernel geladenen BPF-Programme auf. 'ps' für BPF-Programme. Beispiele.
Motivation
BPF garantiert, dass die in den Kernel geladenen Programme nicht abstürzen und nicht ewig laufen können, dennoch ist BPF universell genug, um viele beliebige Berechnungsarten durchzuführen. Derzeit ist es möglich, ein Programm in C zu schreiben, das in ein gültiges BPF-Programm kompiliert wird. Allerdings ist es wesentlich einfacher, ein C-Programm zu schreiben, das in ein ungültiges BPF kompiliert wird (C ist so). Der Benutzer wird erst beim Versuch, das Programm auszuführen, wissen, ob es gültig war oder nicht.
Mit einem BPF-spezifischen Frontend sollte man in der Lage sein, in einer Sprache zu schreiben und vom Compiler Feedback zur Gültigkeit in Bezug auf ein BPF-Backend zu erhalten. Ziel dieses Toolkits ist es, ein Frontend bereitzustellen, das nur gültige BPF-Programme erstellen kann und dennoch seine volle Flexibilität nutzt.
Darüber hinaus weisen aktuelle Integrationen mit BPF einen umständlichen Arbeitsablauf auf, der manchmal das direkte Kompilieren in einem Linux-Kernel-Quellbaum erfordert. Ziel dieser Toolchain ist es, die Zeit, die ein Entwickler für die Kompilierung von BPF aufwendet, zu minimieren und sich stattdessen auf die Anwendungen zu konzentrieren, die geschrieben werden können, und auf die Probleme, die mit BPF gelöst werden können.
Zu den Funktionen dieses Toolkits gehören:
- Durchgängiger BPF-Workflow in einer gemeinsam genutzten Bibliothek
- Eine modifizierte C-Sprache für BPF-Backends
- Integration mit dem llvm-bpf-Backend für JIT
- Dynamisches (Ent-)Laden von JIT-Programmen
- Unterstützung für BPF-Kernel-Hooks: Socket-Filter, TC-Klassifikatoren, TC-Aktionen und Kprobes
- Bindungen für Python
- Beispiele für Socket-Filter, TC-Klassifikatoren und Kprobes
- Eigenständige Tools zum Verfolgen eines laufenden Systems
In Zukunft werden wahrscheinlich weitere Bindungen neben Python unterstützt. Fügen Sie gerne Unterstützung für die Sprache Ihrer Wahl hinzu und senden Sie eine Pull-Anfrage!
Tutorials
- docs/tutorial.md: Verwenden von bcc-Tools zur Lösung von Leistungs-, Fehlerbehebungs- und Netzwerkproblemen.
- docs/tutorial_bcc_python_developer.md: Entwickeln neuer BCC-Programme mithilfe der Python-Schnittstelle.
Vernetzung
Auf dem Red Hat Summit 2015 wurde BCC im Rahmen einer Sitzung zum Thema BPF vorgestellt. Es wird eine Multi-Host-VXLAN-Umgebung simuliert und ein BPF-Programm zur Überwachung einer der physischen Schnittstellen verwendet. Das BPF-Programm führt Statistiken über die inneren und äußeren IP-Adressen, die die Schnittstelle durchlaufen, und die Userspace-Komponente wandelt diese Statistiken in ein Diagramm um, das die Verkehrsverteilung in mehreren Granularitäten zeigt. Den Code finden Sie hier.
Mitwirken
Sind Sie schon bereit, Code zu übernehmen? Hier finden Sie einige Ressourcen, um an den Diskussionen in der IOVisor-Community teilzunehmen und herauszufinden, woran Sie arbeiten möchten.
- Mailingliste: https://lists.iovisor.org/mailman/listinfo/iovisor-dev
- IRC: #iovisor auf irc.oftc.net
- BCC Issue Tracker: Github-Probleme
- Eine Anleitung für beitragende Skripte: CONTRIBUTING-SCRIPTS.md
Externe Links
Suchen Sie weitere Informationen zu BCC und seiner Verwendung? Links zu anderen BCC-Inhalten im Internet finden Sie unter LINKS.md.