[LINUX] Tetris mit bpftrace

Hallo zusammen. Kennen Sie plötzlich bpftrace? Wie der Name schon sagt, handelt es sich um ein Tracing-Tool, das bpf verwendet. Das Design von bpftrace wird von den vorhandenen DTrace und SystemTap beeinflusst. Für diejenigen, die mit diesen Tools vertraut sind, ist bpftrace möglicherweise einfacher (wenn auch sehr grob), die BPF-Version von DTrace oder SystemTap zu sagen.

Im Allgemeinen ist es beim Durchführen der Ablaufverfolgung mit BPF erforderlich, 1) das BPF-Programm selbst und 2) ein Userland-Programm zum Anzeigen der Ablaufverfolgungsergebnisse zu schreiben, aber bpftrace verwendet eine eigene Skriptsprache, um sie zu schreiben. Die Ablaufverfolgung kann ohne besondere Kenntnis beschrieben werden. Wenn Sie beispielsweise die Anzahl der vom Prozess ausgegebenen Systemaufrufe zählen möchten, können Sie wie folgt vorgehen. Es ist bequem.

% bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }'
Attaching 1 probe...
^C

@[systemd-journal]: 5
@[sudo]: 7
@[vim]: 12
@[dockerd]: 23
@[bpftrace]: 25
@[sshd]: 26
@[tmux: server]: 29
@[containerd]: 113

Intern analysiert bpftrace das Skript, gibt das LLVM-IR aus, kompiliert es in ein BPF-Programm und lädt es in den Kernel. Gleichzeitig wird das Programm bpftrace selbst zur Laufzeit und zeigt die Ablaufverfolgungsergebnisse an.

Apropos

In SystemTap, Tetris und anderen Spiele scheinen zu funktionieren. Würde es sich nicht fragen, ob bpftrace dasselbe tun könnte?

Damit

Ich habe tetris.stp auf bpftrace portiert.

https://github.com/mmisono/bpftrace-tetris

rec4.gif

Eigentlich habe ich die ursprüngliche tetris.stp nicht verschoben, daher kenne ich das ursprüngliche Verhalten nicht, aber es funktioniert so, also bin ich sicher, dass es in Ordnung ist [^ 0].

[^ 0]: Die erste Ausführungszeit ist die Kompilierungs- und Ladezeit des BPF-Programms.

FAQ

Frage: Was ist los?

Durch Anhängen des BPF-Programms an das Softwareereignis der CPU-Uhr von perf kann das BPF-Programm in regelmäßigen Abständen aufgerufen werden. In diesem BPF-Programm wird der Status der in der BPF-Karte gespeicherten Karte aktualisiert und der Bildschirm neu gezeichnet. Um den Bildschirm neu zu zeichnen, gibt das BPF-Programm tatsächlich eine Nachricht mit "perf_event_output ()" aus, und das Userland-bpftrace-Programm, das die Nachricht empfängt, verwendet die ANSI-Escape-Sequenz. Wiki / ANSI_escape_code) wird zum Zeichnen verwendet.

Frage: Was ist die Schlüsseleingabe?

In der ursprünglichen Implementierung kbd_envet () Haken Sie die Funktion ein und geben Sie den Schlüssel ein Ich habe es verstanden, aber diese Funktion scheint nur auf die physische Tastatur zu reagieren und konnte nicht in der SSH-Umgebung verwendet werden. Stattdessen [pty_write ()](https://github.com/torvalds/linux/blob/v5 .4 / drivers / tty / pty.c # L111) ist mit kprobe verbunden, um Tastenanschläge zu erfassen. Ich weiß nicht, ob das der beste Weg ist.

F. In meiner Umgebung funktioniert es nicht

Für den Betrieb ist Linux 5.3 oder höher erforderlich. Andernfalls kann das BPF-Programm nicht geladen werden, da es in der maximalen Anzahl von Anweisungen des BPF-Programms abgefangen ist. Ursprünglich hatten BPF-Programme ein Limit von 4096 Anweisungen pro Programm, um das Ende der Ausführung für einen bestimmten Zeitraum zu gewährleisten. Seit Linux 5.3 können privilegierte Benutzer jedoch Programme mit bis zu 1 Million Anweisungen laden [^ 1]. .. Verwenden Sie für bcc den Hauptzweig auf github und für bpftrace den diesen Zweig </ del> Hauptzweig auf github. Einige der neuesten Funktionen werden verwendet [^ 2].

[^ 1]: Es klingt etwas extrem zu sagen, dass die maximale Anzahl von Anweisungen von 4096 auf 1 Million erhöht wurde, aber die Realität ist nicht so einfach. Ob ein BPF-Programm tatsächlich ausgeführt werden kann oder nicht, hängt davon ab, ob die Überprüfung durch den Prüfer innerhalb einer bestimmten Anzahl abgeschlossen ist, zusätzlich zur Obergrenze der Anzahl der BPF-Anweisungen. Zum Beispiel kann ein BPF-Programm durch einen Tail-Aufruf zu einem anderen BPF-Programm übergehen, aber in diesem Fall überprüft verifeir den BPF-Befehl einschließlich des Übergangs. Daher ist die Anzahl der vom Prüfer überprüften Anweisungen größer als die Anzahl der Anweisungen in einem einzelnen BPF-Programm. Die maximale Anzahl von Anweisungen, die dieser Prüfer überprüfen kann (BPF_COMPLEXITY_LIMIT_INSNS), wurde erhöht, wenn der Prüfer schneller wird, und in Linux 5.3 hat er 1 Million erreicht. Gleichzeitig wurde die Programmgrößenbeschränkung beim Laden eines Programms für privilegierte Benutzer auf "BPF_COMPLEXITY_LIMIT_INSNS" angehoben (das Commit.

[^ 2]: Soll es nicht auf bpftrace gepatcht werden? Bitte vergib mir, weil es wahrscheinlich bald mit dem Hauptteil verschmolzen wird ... In Zukunft werden bcc v0.12.0 und bpftrace v0.9.4 und höher verfügbar sein (beide wurden noch nicht veröffentlicht).

F. Ich möchte es wirklich in einer Umgebung vor Linux 5.2 ausführen

Um mit Linux 5.2 oder früher arbeiten zu können, müssen Sie die Größe des BPF-Programms reduzieren.

Das diesmal erstellte Programm ist fast wie [^ 3] ein Port der SystemTap-Version, aus Sicht des BPF-Programms jedoch ineffizient. Vor allem wird der Status der Quadrate auf dem Board einzeln in der BPF-Karte gespeichert. Dies ist jedoch ein Prozess, der bei jedem Zugriff "bpf_map_lookup_elem ()" erfordert, was sehr ineffizient ist. Da jede Datenstruktur in der BPF-Karte gespeichert werden kann, sollte die gesamte Karte in einem BPF-Karteneintrag gespeichert und in einem Stapel geladen und gespeichert werden. Derzeit kann bpftrace jedoch keine anderen Werte als int in der Karte speichern. Darüber hinaus ist das Abrollen der gesamten Schleifenverarbeitung von BPF-Programmen einer der Gründe für die Zunahme der Anweisungen. Dies liegt daran, dass BPF-Programme, die Schleifen enthalten, mit dem Verifizierer abgespielt werden. Sie können Bounded Loop verwenden, um unter bestimmten Einschränkungen eine Schleife zu erstellen. Dies ist jedoch auch eine in Linux 5.3 eingeführte Funktion (und bpftrace verwendet derzeit Bounded Loops). Nicht unterstützt).

Es gibt auch eine Methode zum Verketten von BPF-Programmen unter Verwendung von bpf tail call als Technik, um die Obergrenze der Anzahl von Anweisungen zu vermeiden, aber bpftrace unterstützt dies derzeit ebenfalls nicht. Es gibt auch eine spezielle Technik zum Teilen des BPF-Programms und zum Anhängen mehrerer BPF-Programme an ein Ereignis. Wenn das Ereignis jedoch abfällt, wird das BPF-Programm nicht aufgerufen, sodass es schwierig ist, einen konsistenten Betrieb zu gewährleisten.

Ich denke, es ist ziemlich schwierig, ein Tetris zu erstellen, das mit Linux 5.2 oder früher ordnungsgemäß funktioniert. Wenn Sie jedoch glauben, dass ich es bin, probieren Sie es aus.

[^ 3]: Nur der Zeileneliminierungsalgorithmus kann keine Schleife schreiben. Es war schwierig, in ein BPF-Programm zu schreiben, deshalb habe ich es ein wenig geändert.

Fazit

Wenn Sie mit bpftrace Ihr Bestes geben, funktioniert Tetris.


Scherz beiseite, bpftrace befindet sich derzeit in der aktiven Entwicklung für v1.0. Tetris funktioniert möglicherweise nicht, ist jedoch im 4.x-Kernel verfügbar. Die Hauptfunktionen sind vollständig und können praktisch genug verwendet werden [^ 4], es können jedoch weiterhin Probleme mit den Details auftreten. Wenn Sie interessiert sind, probieren Sie es aus und melden Sie alle Probleme an issue. Die Installationsmethode ist für jede Distribution in [hier] zusammengefasst (https://github.com/iovisor/bpftrace/blob/master/INSTALL.md). Informationen zur Verwendung finden Sie unter Offizielles Tutorial.

Außerdem wird erst in diesem Monat ein Teil von bpftrace entwickelt Brendan Greggs BPF-Buch. Da die E-Book-Version bereits veröffentlicht wurde, habe ich sie kurz gelesen, aber während ich mich auf bpftrace als Tool konzentriere, gibt es auch eine kleine, aber solide Erklärung für vorhandene Tracing-Tools (obwohl ich sie aus dem Titel nicht kenne). , Ich dachte, dass sich das Buch auf die Verbesserung praktischer Leistungsprobleme konzentriert. Übrigens gibt es fast keine anderen Geschichten über BPF als Tracing wie XDP [^ 5], so dass sie unterschiedliche Dokumente treffen [^ 6].

[^ 4]: Es scheint, dass Facebook und Netflix bereits in der Produktionsumgebung verwendet werden (vgl. Https://www.slideshare.net/brendangregg/um2019-bpf-a-new-type-of-software; Es heißt nur, dass das BPF-Programm verwendet wird, es kann also ein bcc-Tool anstelle von bpftrace sein.

[^ 5]: Es gibt ein ganzes Kapitel zur Analyse der Netzwerkleistung.

[^ 6]: Ich denke, die Erklärung von BPF C und die Geschichte des BPF-Befehlssatzes im Anhang sind nützlich.

Recommended Posts

Tetris mit bpftrace