eBPF (Extended Berkeley Packet Filter) est l’une des évolutions les plus significatives du noyau Linux de ces dernières années. Initialement conçu pour filtrer les paquets réseau, eBPF permet aujourd’hui d’exécuter des programmes sandboxés directement dans le kernel, sans modification de son code source ni chargement de modules personnalisés. En 2026, cette technologie s’est imposée comme le socle de toute une génération d’outils d’observabilité, de sécurité et de networking.
Pour un administrateur système Linux, eBPF ouvre une fenêtre sans précédent sur ce qui se passe réellement à l’intérieur du kernel : appels système, latences I/O, activité réseau, comportement des processus — le tout avec un impact CPU minimal et sans redémarrage ni instrumentation applicative. Cet article présente les outils bpftrace et BCC (BPF Compiler Collection), les deux frontaux les plus utilisés en pratique.
Comment fonctionne eBPF
Un programme eBPF est compilé en bytecode, vérifié par le kernel (via le verifier) pour s’assurer qu’il ne peut ni planter ni bloquer le système, puis exécuté dans une machine virtuelle JIT-compilée directement dans l’espace noyau. Les points d’accroche (hooks) sont nombreux : appels système, fonctions kernel, sondes réseau, tracepoints USDT (userspace).
Les deux outils principaux :
- bpftrace — langage de haut niveau inspiré de DTrace, idéal pour les one-liners et scripts courts. Parfait pour l’investigation ad-hoc.
- BCC (BPF Compiler Collection) — collection d’outils préconstruits (plus de 70) pour les tâches courantes : traçage I/O, réseau, CPU, mémoire.
Installation
Debian / Ubuntu
# Installer bpftrace et les outils BCC
sudo apt update
sudo apt install -y bpftrace bpfcc-tools linux-headers-$(uname -r)
# Vérifier l'installation
sudo bpftrace -V
# bpftrace v0.21.x
# Lister les tracepoints disponibles (extrait)
sudo bpftrace -l 'tracepoint:syscalls:*' | head -20
RHEL / Rocky Linux / AlmaLinux
sudo dnf install -y bpftrace bcc bcc-tools python3-bcc kernel-devel
Le kernel doit être ≥ 4.15 pour bpftrace, ≥ 5.8 recommandé pour l’ensemble des fonctionnalités. Vérifiez avec
uname -r.
bpftrace — One-liners essentiels
bpftrace s’utilise directement en ligne de commande pour des analyses rapides. Voici les scripts les plus utiles au quotidien :
Appels système par processus
# Compter les appels système par nom de processus (Ctrl+C pour afficher)
sudo bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }'
# Exemple de sortie :
# @[nginx]: 14832
# @[php-fpm]: 8421
# @[mysqld]: 3102
Tracer les ouvertures de fichiers en temps réel
# Afficher quel processus ouvre quel fichier
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat {
printf("%-6d %-16s %sn", pid, comm, str(args->filename));
}'
# Filtrer sur un processus spécifique (ex: php-fpm)
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat /comm == "php-fpm"/ {
printf("%sn", str(args->filename));
}'
Analyser la latence des I/O disque
# Distribution de latence des lectures (histogramme)
sudo bpftrace -e '
tracepoint:block:block_rq_issue { @start[args->dev, args->sector] = nsecs; }
tracepoint:block:block_rq_complete
/@start[args->dev, args->sector]/
{
@usecs = hist((nsecs - @start[args->dev, args->sector]) / 1000);
delete(@start[args->dev, args->sector]);
}'
# Sortie typique :
# @usecs:
# [4, 8) 142 |@@@@@@@@@@@@@ |
# [8, 16) 389 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|
# [16, 32) 87 |@@@@@@@@ |
Détecter les connexions TCP sortantes
# Tracer toutes les nouvelles connexions TCP avec IP et port destination
sudo bpftrace -e '
kprobe:tcp_connect {
$sk = (struct sock *)arg0;
printf("%-16s -> %s:%-6dn",
comm,
ntop(AF_INET, $sk->__sk_common.skc_daddr),
$sk->__sk_common.skc_dport >> 8);
}'
BCC — Les outils préconstruits indispensables
BCC fournit plus de 70 outils prêts à l’emploi. Voici les plus utiles en production :
# Tracer tous les processus lancés sur le système
sudo execsnoop-bpfcc
# PID PPID RET ARGS
# 12345 1234 0 /usr/bin/php /var/www/script.php
# 12346 12345 0 /usr/bin/openssl req -new ...
# Monitorer les ouvertures de fichiers avec erreurs (ENOENT, EACCES...)
sudo opensnoop-bpfcc -x
# Analyser la latence I/O disque par device (histogramme)
sudo biolatency-bpfcc -D
# Compter les appels de fonctions réseau kernel en temps réel
sudo funccount-bpfcc 'tcp_*'
# Filtrer opensnoop sur un PID précis
sudo opensnoop-bpfcc -p $(pgrep nginx | head -1)
Cas d’usage concrets en production
Identifier pourquoi un service est lent
# Mesurer la distribution de latence de chaque syscall pour un processus
PID=$(pgrep -n php-fpm)
sudo bpftrace -e "
tracepoint:raw_syscalls:sys_enter /pid == $PID/ {
@start[tid] = nsecs;
}
tracepoint:raw_syscalls:sys_exit /pid == $PID && @start[tid]/ {
@latency_us = hist((nsecs - @start[tid]) / 1000);
delete(@start[tid]);
}"
Surveiller l’activité d’un conteneur Docker
# Récupérer l'ID complet du conteneur
CONTAINER_ID=$(docker inspect mon-app --format '{{.Id}}')
# Tracer uniquement les syscalls de ce conteneur via son cgroup
sudo bpftrace -e "
tracepoint:raw_syscalls:sys_enter
/cgroup == cgroupid("/sys/fs/cgroup/system.slice/docker-${CONTAINER_ID}.scope")/
{ @[comm] = count(); }"
Détecter les tentatives d’escalade de privilèges
# Alerter si un processus appelle setuid/setgid de manière inattendue
sudo bpftrace -e '
tracepoint:syscalls:sys_enter_setuid {
printf("ALERT setuid(%d) par %s (pid %d)n", args->uid, comm, pid);
}
tracepoint:syscalls:sys_enter_setgid {
printf("ALERT setgid(%d) par %s (pid %d)n", args->gid, comm, pid);
}'
Points de vigilance
- Droits root obligatoires — tous les outils BPF nécessitent
CAP_BPFou root. Pas de contournement possible en production sans configuration CAP spécifique. - Éviter les printf() dans les hot paths — sur un serveur I/O intensif, un tracepoint sur
block:block_rq_issueavec printf peut générer des milliers de lignes/seconde. Préférer les compteurs et histogrammes. - Filtrer côté kernel — appliquer les filtres
/condition/dans le programme eBPF, pas en post-traitement userspace. - Vérifier la version kernel — certaines fonctionnalités (BTF, CO-RE) nécessitent un kernel ≥ 5.8. Vérifier avec
bpftrace --info | grep "bpf_btf_load".
À lire également
- Surveillance et diagnostic d’un serveur Linux avec vmstat, iotop et htop — les outils classiques de diagnostic à compléter avec eBPF pour une vision complète du système
- Analyse de la mémoire sur Linux — vmstat, free, smem — bpftrace peut approfondir l’analyse mémoire au niveau kernel
- Gestion des ressources cgroups v1/v2 avec LXC — eBPF s’intègre étroitement avec les cgroups pour l’observabilité par conteneur
- Centralisation logs avec ELK Stack — Elasticsearch, Kibana, Filebeat — complémentaire : eBPF pour l’observabilité temps réel, ELK pour la rétention et l’analyse historique