Commande Linux bpftrace
bpftrace est un outil de traçage avancé basé sur eBPF (extended Berkeley Packet Filter). Il permet aux développeurs d'observer et d'analyser dynamiquement l'état d'exécution des systèmes Linux sans modifier le code du noyau.
eBPF est une technologie révolutionnaire dans le noyau Linux. Il fournit un environnement de machine virtuelle sécurisé capable d'exécuter du code défini par l'utilisateur dans le noyau. bpftrace est construit au-dessus d'eBPF, offrant une couche d'abstraction plus simple et de plus haut niveau.
Avantages principaux de bpftrace
Observation système en temps réel
- Pas besoin de redémarrer le système ou les applications
- Surcharge de performance extrêmement faible
- Peut observer à la fois les programmes du noyau et de l'espace utilisateur
Capacités de sondage flexibles
- Prend en charge plusieurs types de points de sonde : entrée/sortie de fonction, minuteries, événements matériels, etc.
- Peut tracer les appels système, les événements réseau, les E/S disque, etc.
Langage de script simple
- Syntaxe de type AWK avec une courbe d'apprentissage douce
- Ensemble riche de fonctions et variables intégrées
- Prend en charge le filtrage conditionnel et les statistiques agrégées
Installation et configuration de bpftrace
Méthodes d'installation
Exemple
sudo apt install bpftrace
# CentOS/RHEL
sudo yum install bpftrace
# Compiler depuis les sources
git clone https://github.com/iovisor/bpftrace.git
mkdir bpftrace/build && cd bpftrace/build
cmake ..
make
sudo make install
Vérifier l'installation
sudo bpftrace -e 'BEGIN { printf("Hello, bpftrace!n"); }'
Syntaxe de base de bpftrace
Un programme bpftrace se compose de points de sonde et d'actions associées. La structure de base est la suivante :
probe /filter/ {
action
}
Types de points de sonde
| Type de point de sonde | Description | Exemple |
|---|---|---|
kprobe |
Entrée de fonction du noyau | kprobe:vfs_read |
kretprobe |
Retour de fonction du noyau | kretprobe:vfs_read |
uprobe |
Entrée de fonction de l'espace utilisateur | uprobe:/bin/bash:readline |
tracepoint |
Point de trace statique du noyau | tracepoint:syscalls:sys_enter_open |
interval |
Déclenché par minuterie | interval:s:5 |
software |
Événements logiciels | software:faults:major |
Variables intégrées courantes
pid: ID du processus actueltid: ID du thread actuelcomm: Nom du processus actuelnsecs: Horodatage en nanosecondesarg0-argN: Arguments de fonctionretval: Valeur de retour de fonction
Exemples pratiques de bpftrace
1. Traçage des appels système
Exemple
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_open { @[comm] = count(); }'
2. Analyse du temps d'exécution des fonctions
Exemple
sudo bpftrace -e '
kprobe:vfs_read { @start[tid] = nsecs; }
kretprobe:vfs_read /@start[tid]/ {
@times = hist(nsecs - @start[tid]);
delete(@start[tid]);
}'
3. Surveillance des accès aux fichiers par processus
Exemple
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat /pid == 1234/ { printf("%s -> %sn", comm, str(args->filename)); }'
4. Comptage des connexions TCP
Exemple
sudo bpftrace -e 'kprobe:tcp_connect { @[comm] = count(); }'
Fonctionnalités avancées de bpftrace
1. Fonctionnalité des maps
bpftrace fournit une variété de types de maps intégrés pour l'agrégation de données :
Exemple
@hist = hist(nsecs);
# Calculer la moyenne
@avg = avg(nsecs);
# Compter les valeurs uniques
@unique = count();
2. Filtrage conditionnel
Exemple
tracepoint:syscalls:sys_enter_read /pid == 1234/ {
printf("PID %d lit %d bytesn", pid, args->count);
}
3. Combinaison de sondes multiples
Exemple
kprobe:sock_alloc {
@socket[tid] = 1;
}
kprobe:tcp_connect /@socket[tid]/ {
printf("socket %d se connecte à %s:%dn", args->sock->__sk_common.skc_dport,
ntop(args->sock->__sk_common.skc_daddr),
args->sock->__sk_common.skc_dport);
delete(@socket[tid]);
}
bpftrace Bonnes pratiques
- Limiter la portée de la trace: Utiliser le filtrage par PID ou par nom de commande pour réduire la charge système
- Éviter l'impression excessive: Trop d'appels à printf peuvent affecter les performances
- Utiliser l'agrégation: Utiliser count(), sum() et d'autres fonctions d'agrégation lorsque c'est possible
- Nettoyer les ressources: Les scripts de longue durée devraient nettoyer périodiquement les données de map
- Considérations de sécurité: bpftrace nécessite des privilèges root ; soyez prudent lors de l'exécution de scripts inconnus
Comparaison de bpftrace avec d'autres outils
| Outil | Avantages | Inconvénients |
|---|---|---|
| bpftrace | Flexible, hautes performances, facile à utiliser | Nécessite des privilèges root |
| strace | Simple, aucune compilation requise | Surcoût de performance élevé |
| perf | Fonctionnalités complètes, faible surcoût | Courbe d'apprentissage abrupte |
| SystemTap | Puissant | Nécessite une compilation, une configuration complexe |
Ressources d'apprentissage recommandées
bpftrace est un outil puissant pour l'analyse des performances système et le dépannage. En pratiquant ces exemples et en maîtrisant ses concepts fondamentaux, vous pourrez acquérir une compréhension plus approfondie du comportement d'exécution du système Linux et l'optimiser.
Autres extensions
Référence des commandes Linux