RousselTMLEARNING

Observabilité

Profiling continu avec eBPF : Parca, Pyroscope et le profiler OpenTelemetry

Profiler en continu tous les processus d'un hôte grâce à eBPF : principe, Parca et parca-agent, Pyroscope via Alloy, profiler eBPF d'OpenTelemetry, symboles et langages pris en charge.

1. Le principe #

Échantillonner les piles d'appels depuis le noyau.

Comment ça marche #

Un programme eBPF attaché à un perf event (par exemple 19 fois par seconde par CPU) lit la pile d'appels du processus en cours, côté noyau et côté utilisateur, et l'agrège dans une map. L'agent remonte périodiquement les piles agrégées, les symbolise et les envoie au serveur.

AvantageLimite
Aucune modification du code, tous les processusProfils CPU surtout (pas d'allocations mémoire)
Surcoût très faibleBesoin des symboles (binaires non « strippés » ou fichiers debuginfo)
Inclut le noyauAgent privilégié sur chaque nœud

2. Les outils #

Trois options open source.

Comparatif #

OutilAgentStockage / interface
Parcaparca-agent (DaemonSet)Serveur Parca, interface intégrée (port 7070)
PyroscopeAlloy pyroscope.ebpfPyroscope + Grafana (voir la formation Pyroscope)
Profiler eBPF OpenTelemetryAgent donné par Elastic, intégré au CollectorTout backend acceptant les profils OTLP

Parca avec Docker #

docker network create prof
docker run -d --name parca --network prof -p 7070:7070 ghcr.io/parca-dev/parca:latest /parca
docker run -d --name parca-agent --network prof --privileged --pid host \
  -v /sys/kernel/debug:/sys/kernel/debug -v /lib/modules:/lib/modules:ro \
  ghcr.io/parca-dev/parca-agent:latest \
  --remote-store-address=parca:7070 --remote-store-insecure

L'interface (http://localhost:7070) affiche les profils CPU de tous les processus, filtrables par labels (comm, conteneur, pod).

À savoir : Les options exactes de l'agent évoluent selon les versions : consultez le README de parca-agent si une option est refusée.

3. Les symboles #

Des noms de fonctions plutôt que des adresses.

Bien symboliser #

  • Go, Rust, C/C++ : gardez les tables de symboles (pas de strip, pas de -ldflags="-s -w") ou publiez les fichiers debuginfo.
  • Java, Node.js, Python : les agents récents savent dérouler les piles de ces environnements ; vérifiez la liste des runtimes pris en charge par votre agent.
  • Parca peut récupérer les symboles depuis un serveur debuginfod pour les paquets des distributions.

Articles liés

eBPF expliqué : des programmes dans le noyau Linux pour observer sans instrumenter

Ce qu'est eBPF, comment un programme est vérifié puis exécuté dans le noyau, les points d'accroche (kprobes, …

Diagnostiquer avec bpftrace et les outils bcc

Les outils eBPF du diagnostic au quotidien : one-liners bpftrace (appels système, fichiers, latences), outils…

Instrumenter sans code avec Grafana Beyla (OpenTelemetry eBPF Instrumentation)

Obtenir métriques RED et traces HTTP/gRPC de n'importe quelle application sans la modifier : Grafana Beyla et…

Pour aller plus loin