[LINUX] Tetris avec bpftrace

Bonjour à tous. Du coup, connaissez-vous bpftrace? Comme son nom l'indique, c'est un outil de traçage qui utilise bpf. La conception de bpftrace est influencée par les DTrace et SystemTap existants. Pour ceux qui connaissent ces outils, bpftrace peut être plus facile (bien que très grossier) à dire la version BPF de DTrace ou SystemTap.

Généralement, lors du traçage à l'aide de BPF, il est nécessaire d'écrire 1) le programme BPF lui-même et 2) un programme utilisateur pour afficher les résultats du traçage, mais bpftrace utilise son propre langage de script pour les écrire. Le traitement du traçage peut être décrit sans aucune prise de conscience particulière. Par exemple, si vous souhaitez compter le nombre d'appels système émis par processus, vous pouvez procéder comme suit. C'est pratique.

% 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

En interne, bpftrace analyse le script, génère un LLVM IR, le compile dans un programme BPF et le charge dans le noyau. En même temps, le programme bpftrace devient lui-même le moteur d'exécution et affiche les résultats du traçage.

au fait

Dans SystemTap, Tetris et autres les jeux semblent fonctionner. Ne serait-il pas se demander si bpftrace pourrait faire la même chose?

Alors

J'ai essayé de porter tetris.stp sur bpftrace.

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

rec4.gif

En fait, je n'ai pas déplacé le tetris.stp d'origine, donc je ne connais pas le comportement d'origine, mais ça marche comme ça, donc je suis sûr que ça va [^ 0].

[^ 0]: Le premier temps d'exécution est le temps de compilation et de chargement du programme BPF.

FAQ

Q. Que se passe-t-il?

En attachant le programme BPF à l'événement logiciel de l'horloge cpu de perf, le programme BPF peut être appelé à intervalles réguliers. Dans ce programme BPF, l'état de la carte enregistrée dans la carte BPF est mis à jour et l'écran est redessiné. Pour redessiner l'écran, le programme BPF produit en fait un message avec perf_event_output (), et le programme userland bpftrace qui reçoit le message utilise la séquence d'échappement ANSI. Wiki / ANSI_escape_code) est utilisé pour le dessin.

Q. Quelle est l'entrée clé?

Dans l'implémentation d'origine kbd_envet () Accrochez la fonction et entrez la clé Je l'ai compris, mais cette fonction semble ne répondre qu'au clavier physique et ne pouvait pas être utilisée dans l'environnement ssh, donc à la place [pty_write ()](https://github.com/torvalds/linux/blob/v5 .4 / drivers / tty / pty.c # L111) est raccordé à kprobe pour capturer les frappes. Je ne sais pas si c'est la meilleure façon.

Q. Cela ne fonctionne pas dans mon environnement

Linux 5.3 ou supérieur est requis pour le fonctionnement. Sinon, le programme BPF ne peut pas être chargé car il est pris dans la limite supérieure du nombre d'instructions du programme BPF. A l'origine, les programmes BPF avaient une limite de 4096 instructions par programme pour garantir la fin de l'exécution pendant un certain temps, mais depuis Linux 5.3, les utilisateurs privilégiés peuvent charger des programmes avec jusqu'à 1 million d'instructions [^ 1]. .. Pour bcc, utilisez la branche master sur github et pour bpftrace, utilisez la branche master this branch </ del> master branche sur github. Certaines des dernières fonctions sont utilisées [^ 2].

[^ 1]: Cela semble un peu extrême de dire que le nombre maximum d'instructions est passé de 4096 à 1 million, mais la réalité n'est pas si simple. Le fait qu'un programme BPF puisse réellement être exécuté ou non dépend du fait que la vérification par le vérificateur est terminée dans un certain nombre, en plus de la limite supérieure du nombre d'instructions BPF. Par exemple, un programme BPF peut passer à un autre programme BPF par appel de fin, mais dans ce cas, verifeir vérifie l'instruction BPF comprenant la transition. Par conséquent, le nombre d'instructions vérifiées par le vérificateur est supérieur au nombre d'instructions dans un seul programme BPF. Le nombre maximum d'instructions que ce vérificateur peut vérifier (BPF_COMPLEXITY_LIMIT_INSNS) a été augmenté à mesure que le vérificateur accélère, et dans Linux 5.3, il a atteint 1 million. Parallèlement à cela, la limite de taille du programme lors du chargement d'un programme a également été augmentée à BPF_COMPLEXITY_LIMIT_INSNS pour les utilisateurs privilégiés (le commit).

[^ 2]: N'est-il pas censé être patché sur bpftrace? Veuillez me pardonner car il sera probablement bientôt fusionné dans le corps principal ... </ del> (2019-12-6 postscript: merged À l'avenir, bcc v0.12.0 et bpftrace v0.9.4 et supérieur seront disponibles (les deux n'ont pas encore été publiés).

Q. Je veux vraiment l'exécuter dans un environnement antérieur à Linux 5.2

Pour travailler avec Linux 5.2 ou une version antérieure, vous devez réduire la taille du programme BPF.

Le programme créé cette fois est un portage de la version SystemTap presque tel quel [^ 3], mais il est inefficace du point de vue du programme BPF. Surtout, l'état des carrés sur la carte est enregistré dans la carte BPF un par un, mais c'est un processus qui nécessite bpf_map_lookup_elem () à chaque fois qu'on y accède, ce qui est très inefficace. Comme toute structure de données peut être stockée dans la carte BPF, la carte entière doit être enregistrée dans une entrée de carte BPF et chargée et stockée dans un lot. Cependant, actuellement bpftrace ne peut pas stocker de valeurs autres que int dans la carte. De plus, le déroulement de tous les traitements en boucle des programmes BPF est l'une des raisons de l'augmentation des instructions. Ceci est dû au fait que les programmes BPF contenant des boucles sont lus avec le vérificateur. Vous pouvez utiliser Bounded Loop pour boucler sous certaines contraintes, mais c'est aussi une fonctionnalité introduite dans Linux 5.3 (et bpftrace utilise actuellement des boucles bornées). Non supporté).

Il existe également une méthode de chaînage des programmes BPF utilisant l'appel de queue bpf comme technique pour éviter la limite supérieure du nombre d'instructions, mais bpftrace ne le prend pas en charge actuellement non plus. Il existe également une technique spéciale consistant à diviser le programme BPF et à attacher plusieurs programmes BPF à un événement, mais lorsqu'un événement tombe, le programme BPF n'est pas appelé, il est donc difficile de garantir un fonctionnement cohérent.

Donc, je pense qu'il est assez difficile de créer un Tetris qui fonctionne correctement avec Linux 5.2 ou une version antérieure, mais si vous pensez que c'est moi, pourquoi ne pas essayer?

[^ 3]: Seul l'algorithme d'élimination de ligne ne peut pas écrire une boucle, c'était difficile d'écrire dans un programme BPF, donc je l'ai un peu changé.

Conclusion

Si vous faites de votre mieux avec bpftrace, Tetris fonctionnera.


Blague à part, bpftrace est actuellement en développement actif pour la v1.0. Tetris peut ne pas fonctionner, mais il est disponible dans le noyau 4.x. Les fonctions principales sont complètes et peuvent être utilisées pratiquement suffisamment [^ 4], mais il peut encore y avoir des problèmes avec les détails. Si vous êtes intéressé, essayez-le et signalez tout problème à issue. La méthode d'installation est résumée pour chaque distribution dans ici. Pour savoir comment l'utiliser, reportez-vous au Tutoriel officiel.

De plus, ce mois-ci, une partie de bpftrace est en cours de développement livre BPF de Brendan Gregg. Puisque la version du livre électronique a déjà été publiée, je l'ai lue brièvement, mais tout en me concentrant sur bpftrace en tant qu'outil, il y a aussi une petite mais solide explication des outils de traçage existants (bien que je ne sache pas par le titre). , J'ai pensé que ce serait bien d'avoir un livre qui se concentre sur l'amélioration des problèmes de performances pratiques. En passant, il n'y a presque pas d'histoires sur BPF autres que le traçage, comme XDP [^ 5], donc ils vont frapper des documents différents [^ 6].

[^ 4]: Il semble que Facebook et Netflix soient déjà utilisés dans l'environnement de production (cf. https://www.slideshare.net/brendangregg/um2019-bpf-a-new-type-of-software; Il dit seulement que le programme BPF est utilisé, donc il peut s'agir d'un outil cci au lieu de bpftrace)

[^ 5]: Il y a un chapitre entier sur l'analyse des performances du réseau.

[^ 6]: Je pense que l'explication de BPF C et l'histoire du jeu d'instructions BPF en annexe sont utiles.

Recommended Posts

Tetris avec bpftrace