eBPF sur Linux : observabilité et traçage kernel avec bpftrace et BCC

28 avril 2026 — par admin_libra

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_BPF ou 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_issue avec 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

Références

Index complet

Tous les articles (58)

Date Article Tags
20/07/2026 SSL : Certificat Let's Encrypt avec Certbot sur Debian/Ubuntu (sans Snap) apache certbot certificat 20/07/2026 MariaDB : Tuning mariadb server sous debian / ubuntu et operation de maintenance sauvegarde/restauration debian innodb maintenance 20/07/2026 MariaDB : Mise en place d'une réplication Master → Slave base-de-données binlog debian 20/07/2026 OpenSVC : piloter des conteneurs LXC sur datasets ZFS avec snapshots et réplication sous Debian/Ubuntu conteneurs debian haute-disponibilité 20/07/2026 SCREEN : utilisation et cas d'usage des screens sous Linux administration bash debian 20/07/2026 EtherPAD : installation et configuration d'Etherpad collaboration debian editeur-collaboratif 20/07/2026 Wazuh 4.14 : déployer un SIEM/XDR open source sur Debian/Ubuntu compliance debian fim 20/07/2026 Incus 7.x : gérer conteneurs système et VMs sur Debian/Ubuntu — le successeur communautaire de LXD conteneurs debian incus 20/07/2026 Restic : sauvegardes incrémentielles chiffrées sur Debian et Ubuntu backup chiffrement debian 20/07/2026 Restic : sauvegardes chiffrées et dédupliquées sur Debian/Ubuntu automatisation backup chiffrement 30/06/2026 PHP : gérer plusieurs versions PHP-FPM avec les dépôts Sury sur Debian/Ubuntu administration apache debian 22/06/2026 OS : Cycle de vie LTS et mise à jour des distributions — apt dist-upgrade et do-release-upgrade sous Debian / Ubuntu apt cycle-de-vie debian 17/06/2026 APT : Guide complet de la gestion des paquets sous Debian et Ubuntu administration apt debian 17/06/2026 SHELL : Guide des commandes les plus usuelles et commandes couteau suisse awk bash commandes 17/06/2026 SUDO : implémentation et sécurisation des accès sur Debian/Ubuntu administration audit authentification 17/06/2026 ProFTPd : authentification MySQL centralisée, FTPs (SSL) et SFTP sur Debian/Ubuntu authentification debian ftp 09/06/2026 Fail2ban — configuration avancée et filtres personnalisés bruteforce debian fail2ban 07/06/2026 Docker : comment récupérer de l'espace disque cache conteneurs debian 07/06/2026 Graylog 7 — Centralisation et analyse de logs : l'alternative à ELK sur Debian/Ubuntu centralisation debian elk 07/06/2026 OpenZFS : tiering avec L2ARC et SLOG pour les workloads mixtes cache l2arc nvme 07/06/2026 Scripting Bash avancé — pièges, bonnes pratiques et optimisation automatisation bash bonnes-pratiques 07/06/2026 AppArmor sur Debian/Ubuntu : profils, modes et confinement applicatif apparmor audit confinement 07/06/2026 Durcissement SSH — au-delà des clés publiques 2fa authentification cryptographie 27/05/2026 LXD 6.x : orchestration de conteneurs Linux avec profils et clustering administration clustering conteneurs 27/05/2026 Keepalived — VIP flottante et load balancing sans matériel dédié debian failover haute-disponibilité 27/05/2026 Btrfs sur Linux — snapshots, sous-volumes et compression en pratique administration btrfs compression 21/05/2026 CVE-2026-42945 (NGINX Rift) : analyse et remédiation sur Debian/Ubuntu cve debian heap-overflow 21/05/2026 Tuning kernel Linux — paramètres sysctl essentiels pour la production debian kernel mémoire 21/05/2026 DRBD : réplication de blocs entre deux serveurs en temps réel cluster debian drbd 15/05/2026 CVE-2026-23918 — vulnérabilité Apache 2.4.66 : analyse et correctifs sur Debian/Ubuntu (hors Debian 11) apache cve debian 15/05/2026 CVE-2026-31431 (Copy Fail) — Analyse et remédiation sur Debian/Ubuntu algif_aead copy-fail cve 12/05/2026 Pacemaker et Corosync — cluster haute disponibilité Linux cluster corosync debian 12/05/2026 WireGuard : monter un VPN mesh entre plusieurs serveurs Linux chiffrement linux mesh 12/05/2026 Netdata — monitoring temps réel sans configuration complexe alertes dashboard linux 12/05/2026 nftables en pratique — remplacer iptables sur Debian/Ubuntu debian firewall iptables 12/05/2026 Podman : alternative rootless à Docker — installation et migration conteneurs docker kubernetes 02/05/2026 Prometheus et Grafana sur Debian — installation, configuration et dashboards pratiques alertmanager dashboard debian 02/05/2026 Ansible : automatiser la gestion de serveurs Linux avec des playbooks administration ansible automation 28/04/2026 ZFS sur Linux : snapshots, clones et RAID-Z en pratique administration compression filesystem 28/04/2026 eBPF sur Linux : observabilité et traçage kernel avec bpftrace et BCC bcc bpftrace diagnostic 23/04/2026 Analyse de la mémoire sur Linux — vmstat, free, smem diagnostic mémoire monitoring 23/04/2026 Sécurité Linux — Firewall iptables et nftables firewall iptables nftables 23/04/2026 ZFS sur Linux — Installation et gestion avancée administration filesystem stockage 23/04/2026 Gestion des services avec systemd sur Debian et Ubuntu administration debian services 23/04/2026 Gestion des ressources cgroups v1/v2 avec LXC cgroups conteneurs lxc 23/04/2026 Centralisation logs avec ELK Stack — Elasticsearch, Kibana, Filebeat elasticsearch elk filebeat 23/04/2026 Supervision avec Zabbix 7.0 LTS sur Debian/Ubuntu debian monitoring supervision 23/04/2026 Plusieurs versions PHP-FPM sur Apache Debian/Ubuntu apache debian php-fpm 23/04/2026 Sécurisation avancée PHP-FPM — Multi-VirtualHosts Apache/Nginx apache nginx php-fpm 23/04/2026 Optimisation PHP-FPM — Guide de tuning d'un pool optimisation performance php-fpm 29/07/2025 Docker sur Debian/Ubuntu : Installation, Configuration et Utilisation conteneurs debian docker 03/07/2025 Serveur VPN WireGuard sous linux réseau sécurité vpn 03/07/2025 Authentification par clé publique sur un serveur SSH authentification cryptographie sécurité 27/06/2025 Surveillance et diagnostic d’un serveur Linux avec vmstat, iotop et htop diagnostic htop monitoring 27/06/2025 Mémoire : Utilisation des Huge Pages et implémentation hugepages mémoire noyau 27/06/2025 Mémoire Swap et paramétrage swappiness mémoire noyau performance 18/06/2025 Installation et Configuration des Conteneurs LXC sur Linux administration conteneurs lxc 18/06/2025 Gestion des journaux avec syslog et journalctl administration journalctl logs