Commande Linux bpftrace

Linux 命令大全Référence des commandes Linux


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

# Ubuntu/Debian
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 actuel
  • tid: ID du thread actuel
  • comm: Nom du processus actuel
  • nsecs: Horodatage en nanosecondes
  • arg0-argN: Arguments de fonction
  • retval: Valeur de retour de fonction

Exemples pratiques de bpftrace

1. Traçage des appels système

Exemple

# Compter le nombre d'appels système open
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_open { @[comm] = count(); }'

2. Analyse du temps d'exécution des fonctions

Exemple

# Mesurer le temps d'exécution de vfs_read
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

# Tracer les fichiers ouverts par un processus spécifique
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat /pid == 1234/ { printf("%s -> %sn", comm, str(args->filename)); }'

4. Comptage des connexions TCP

Exemple

# Compter les connexions TCP par processus
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

# Histogramme de comptage
@hist = hist(nsecs);

# Calculer la moyenne
@avg = avg(nsecs);

# Compter les valeurs uniques
@unique = count();

2. Filtrage conditionnel

Exemple

# Tracer uniquement les appels read d'un processus spécifique
tracepoint:syscalls:sys_enter_read /pid == 1234/ {
    printf("PID %d lit %d bytesn", pid, args->count);
}

3. Combinaison de sondes multiples

Exemple

# Tracer l'intégralité du processus depuis la création de la socket jusqu'à la connexion
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

  1. Limiter la portée de la trace: Utiliser le filtrage par PID ou par nom de commande pour réduire la charge système
  2. Éviter l'impression excessive: Trop d'appels à printf peuvent affecter les performances
  3. Utiliser l'agrégation: Utiliser count(), sum() et d'autres fonctions d'agrégation lorsque c'est possible
  4. Nettoyer les ressources: Les scripts de longue durée devraient nettoyer périodiquement les données de map
  5. 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

  1. Documentation officielle de bpftrace
  2. Tutoriel sur les one-liners bpftrace
  3. Dépôt d'exemples bpftrace

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.


Linux 命令大全Référence des commandes Linux

Autres extensions