Trace mit eBPF lernen: Ein Leitfaden und Beispiele

Hallo Habr! Ich mache Sie auf eine Übersetzung eines Artikels von Brendan Gregg auf eBPF aufmerksam

Es gab mindestens 24 eBPF-Präsentationen auf der Linux Plumbers-Konferenz. Es wurde schnell nicht nur eine unschätzbare Technologie, sondern auch eine gefragte Fähigkeit. Vielleicht möchten Sie sich einige Ziele für das neue Jahr setzen - lernen Sie eBPF!


Der Begriff eBPF sollte etwas Wesentliches bedeuten, wie beispielsweise den Virtual Kernel Instruction Set (VKIS), aber sein Ursprung ist ein erweiterter Berkeley Packet Filter. Es ist in vielen Bereichen anwendbar, z. B. in Bezug auf Netzwerkleistung, Firewalls, Sicherheit, Ablaufverfolgung und Gerätetreiber. Für einige von ihnen gibt es viele frei verfügbare Informationen im Internet - zum Beispiel für die Rückverfolgung, für andere jedoch noch nicht. Der Begriff Trace bezieht sich auf Tools zur Leistungsanalyse und Überwachung, mit denen Informationen für jedes Ereignis generiert werden können. Möglicherweise haben Sie bereits einen Tracer verwendet - tcpdump und strace sind spezialisierte Tracer.


In diesem Beitrag werde ich den Prozess des Studierens der Verwendung von eBPF für Rückverfolgungszwecke beschreiben, der in Abschnitte für Anfänger, erfahrene und fortgeschrittene Benutzer unterteilt ist. Zusammenfassend:


  • Anfänger: Starten von bcc- Tools
  • Erfahren: Entwicklung von bpftrace- Tools
  • Fortgeschritten: Entwicklung von bcc- Tools, die zu bcc und bpftrace beitragen

Anfänger


1. Was sind eBPF, bcc, bpftrace und iovisor?


eBPF macht für Linux dasselbe wie JavaScript für HTML. Anstelle einer statischen HTML-Site können Sie mit JavaScript Miniprogramme definieren, die bei Ereignissen wie einem Mausklick ausgeführt werden und in einer sicheren virtuellen Maschine in einem Browser ausgeführt werden. Und mit eBPF können Sie jetzt anstelle der Bearbeitung des Kernels Miniprogramme schreiben, die auf Ereignissen wie Festplatten-E / A auf einer sicheren virtuellen Maschine im Kernel ausgeführt werden. Tatsächlich ähnelt eBPF eher einer virtuellen Maschine der Version 8, auf der JavaScript ausgeführt wird, als JavaScript selbst. eBPF ist Teil des Linux-Kernels.


Das Programmieren direkt in eBPF ist unglaublich schwierig, genau wie in v8-Bytecode. Aber kein Code in Version 8: Jeder schreibt in JavaScript oder häufig in einem Framework über JavaScript (jQuery, Angular, React usw.). Gleiches gilt für eBPF. Die Leute werden es benutzen und Code über Frameworks schreiben. Die wichtigsten für die Rückverfolgung sind bcc und bpftrace . Sie leben nicht in der Kernel-Codebasis, sondern im Linux Foundation-Projekt auf einem Github namens iovisor .


2. Ist es möglich, mit eBPF zu verfolgen?


Dieses eBPF-basierte Dienstprogramm demonstriert vollständig eingerichtete TCP-Sitzungen mit ihrer Prozess-ID (PID), dem Befehlsnamen (COMM), den gesendeten und empfangenen Bytes (TX_KB, RX_KB) und der Dauer in Millisekunden (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 Curl 100.66.3.172 61620 52.205.89.26 80 0 1 91.79
 22604 curl 100.66.3.172 44400 52.204.43.121 80 0 1 121.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
 [...] 


Nicht dieses eBPF macht es möglich - ich kann tcplife neu schreiben, um ältere Kernel-Technologien zu verwenden. Wenn ich das tun würde, würden wir ein solches Tool aufgrund von Leistungseinbußen, Sicherheitsproblemen oder beidem niemals in der Produktion ausführen. eBPF hat dieses Tool praktisch gemacht : Es ist effizient und sicher. Beispielsweise werden nicht alle Pakete nachverfolgt, wie dies bei früheren Ansätzen der Fall war, und dies könnte zu einem übermäßigen Leistungsabfall führen. Stattdessen werden nur TCP-Sitzungsereignisse verfolgt, die viel seltener auftreten. Dies macht den Overhead so gering, dass wir dieses Tool im 24x7-Modus ausführen können.


3. Wie benutze ich das?


Anfänger sollten anfangen, bcc zu erkunden. Siehe bcc Installationsanweisungen für Ihr Betriebssystem. Für Ubuntu sieht es ungefähr so ​​aus:


# 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 Geräteabfrage 4 0 / dev / bus / usb
 ^ C.

Hier habe ich opennoop geöffnet, um die Funktionalität der Tools zu testen. Wenn Sie so weit gekommen sind, haben Sie definitiv eBPF verwendet!


Für Unternehmen wie Netflix und Facebook ist bcc standardmäßig auf allen Servern installiert. Vielleicht möchten Sie das Gleiche tun.


4. Gibt es einen Anfängerleitfaden?


Ja, ich habe einen Leitfaden für bcc geschrieben, der ein guter Ausgangspunkt für Neulinge bei der Verfolgung mit eBPF ist:



Als Anfänger müssen Sie keinen Code für eBPF schreiben. bcc enthält bereits mehr als 70 Tools, die Sie sofort verwenden können. Diese Anleitung führt Sie durch die folgenden elf Schritte: execsnoop, opensnoop, ext4slower (oder btrfs *, xfs *, zfs *), Biolatenz, Biosnoop, Cachestat, tcpconnect, tcpaccept, tcpretrans, runqlat und profile.


Nachdem Sie sie ausprobiert haben, müssen Sie nur wissen, dass es viele andere Mittel gibt:



Sie werden auch vollständig mit Manpage-Tools und Beispieldateien dokumentiert. Beispieldateien (* _example.txt in bcc / tools) enthalten Screenshots mit Erläuterungen: z. B. biolatency_example.txt . Ich habe viele davon geschrieben (sowohl Manpages als auch Tools), die wie zusätzliche 50 Blog-Beiträge aussehen. Sie finden sie im bcc-Repository.


Was fehlt, sind echte Produktionsbeispiele. Ich habe diese Dokumentation geschrieben, als eBPF so neu war, dass es nur in unseren Testumgebungen verfügbar war. Daher sind die meisten Beispiele künstlich. Im Laufe der Zeit werden wir Beispiele aus der Praxis hinzufügen. Hier können Anfänger helfen: Wenn Sie ein Problem lösen, sollten Sie einen Artikel schreiben und Screenshots freigeben oder als Beispieldateien hinzufügen.


Für erfahrene


Zu diesem Zeitpunkt sollten Sie bcc bereits ausführen und diese Tools ausprobieren sowie daran interessiert sein, sie zu ändern und eigene Tools zu schreiben. Der beste Weg ist ein Upgrade auf bpftrace, das eine Hochsprache enthält, die viel einfacher zu erlernen ist. Der Nachteil ist, dass es nicht so flexibel ist wie bcc, so dass Sie möglicherweise auf Einschränkungen stoßen und zu bcc zurückkehren möchten.


Siehe die Installationsanweisungen für bpftrace . Dies ist ein neueres Projekt, daher waren zum Zeitpunkt dieses Schreibens noch nicht für alle Systeme Pakete kompiliert. In Zukunft sollte es nur apt-get install bpftrace oder ähnliches sein.


1. bpftrace Tutorial


Ich habe ein Tutorial entwickelt, das zeigt, wie man bpftrace über eine Reihe von einzeiligen verwendet:



Es gibt 12 Lektionen, in denen Sie Schritt für Schritt lernen, wie Sie bpftrace verwenden. Hier ist ein Beispiel:


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

Der offene Systemaufruf wird als Ablaufverfolgungspunkt verwendet, um die PID und die geöffneten Dateipfade zu verfolgen.


2. bpftrace Referenzhandbuch


Für weitere Informationen zu bpftrace habe ich eine Anleitung geschrieben, die Syntaxbeispiele, Tests und integrierte Befehle enthält:



Dies ist der Kürze halber: Ich versuche, den Titel, den Lebenslauf und den Screenshot auf einer Seite zu platzieren. Ich denke, das ist zu lang - wenn Sie nach etwas suchen und mehrmals durch die Seite scrollen müssen.


3. bpftrace in Beispielen


Das bpftrace-Repository enthält über 20 Tools, die Sie anhand von Beispielen betrachten können:



Zum Beispiel:


# cat tools / biolatency.bt
 [...]
 BEGINNEN
 {
     printf ("Tracing Block Device I / O ... Drücken Sie Strg-C, um zu beenden. \ n");
 }}

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

 kprobe: blk_account_io_completion
 / @ start [arg0] /

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

Wie bcc verfügen diese Dienstprogramme über Manpages und Beispieldateien. Zum Beispiel biolatency_example.txt .


Für Fortgeschrittene


1. Wir untersuchen die Entwicklung von bcc


Ich habe zwei Anleitungen erstellt, um zu helfen:



Es gibt auch viele Beispiele in bcc / tools / *. Py. Bcc-Tools bestehen aus zwei Teilen: BPF-Code für einen in C geschriebenen Kernel und ein in Python (oder lua oder C ++) geschriebenes Tool auf Benutzerbereichsebene. Die Entwicklung von bcc-Tools ist weit fortgeschritten und kann einige kleine Komponenten des Kernels oder interne Anwendungselemente enthalten.


2. Teilnahme an der Entwicklung


Hilfe ist willkommen bei:



Für bpftrace habe ich den internen Entwicklungsleitfaden für bpftrace erstellt. Dies ist schwierig, wenn Sie in llvm IR programmieren, aber wenn Sie bereit sind, die Herausforderung anzunehmen ...


Es gibt auch den Kern von eBPF (auch bekannt als BPF): Wenn Sie sich mit bcc- und bpftrace-Problemen befassen, werden Sie dort mehrere Verbesserungswünsche sehen. Zum Beispiel das Kernel-Tag in bpftrace . In der netdev- Mailingliste finden Sie auch die neuesten BPF-Kernel-Entwicklungen, die net-next hinzugefügt werden, bevor sie mit der Linux-Hauptlinie zusammengeführt werden.


Sie können nicht nur Code schreiben, sondern auch testen, Pakete erstellen, bloggen und diskutieren.


Fazit


eBPF macht viele verschiedene Dinge. In diesem Beitrag habe ich mich mit dem Beherrschen von eBPF für die Ablaufverfolgung und Leistungsanalyse befasst. Zusammenfassend:


  • Anfänger: Starten von bcc- Tools
  • Erfahren: Entwicklung von bpftrace- Tools
  • Fortgeschritten: Entwicklung von bcc- Tools, die zu bcc und bpftrace beitragen

Ich habe auch eine separate Seite über eBPF-Tracing-Tools , auf der all dies ausführlicher behandelt wird. Viel Glück!

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


All Articles