Parca est une plateforme de profilage continu open source qui utilise eBPF pour collecter des données de profilage dans toute votre infrastructure avec un overhead quasi nul. Elle se compose de Parca Agent (collecteur basé sur eBPF) et Parca Server (moteur de stockage et de requêtes).
Installation
Linux/Ubuntu
# Install Parca Server (binary)
curl -sL https://github.com/parca-dev/parca/releases/latest/download/parca_Linux_x86_64.tar.gz | tar xz
sudo mv parca /usr/local/bin/
# Install Parca Agent (binary)
curl -sL https://github.com/parca-dev/parca-agent/releases/latest/download/parca-agent_Linux_x86_64.tar.gz | tar xz
sudo mv parca-agent /usr/local/bin/
# Verify installation
parca --version
parca-agent --version
Docker
# Run Parca Server
docker run -d --name parca \
-p 7070:7070 \
ghcr.io/parca-dev/parca:latest \
/parca --config-path=/parca.yaml
# Run Parca Agent
docker run -d --name parca-agent \
--privileged \
--pid=host \
-v /sys:/sys:ro \
-v /lib/modules:/lib/modules:ro \
ghcr.io/parca-dev/parca-agent:latest \
/parca-agent --node=my-host \
--store-address=parca-server:7070 \
--insecure
Configuration du serveur Parca
# parca.yaml — Configuration du serveur Parca
object_storage:
bucket:
type: "FILESYSTEM"
config:
directory: "/var/lib/parca/data"
# Démarrer le serveur avec la configuration
# parca --config-path=parca.yaml --cors-allowed-origins="*"
# Démarrer le serveur Parca avec les valeurs par défaut (stockage en mémoire)
parca --config-path=parca.yaml
# Adresse d'écoute personnalisée
parca --config-path=parca.yaml --http-address=:7070
# Activer CORS pour l'accès à l'interface web
parca --config-path=parca.yaml --cors-allowed-origins="*"
# Avec journalisation de débogage
parca --config-path=parca.yaml --log-level=debug
# Accéder à l'interface web
# http://localhost:7070
Agent Parca
# Démarrer l'agent avec profilage eBPF (nécessite root/privileged)
sudo parca-agent \
--node=my-hostname \
--store-address=localhost:7070 \
--insecure
# Profiler à une fréquence personnalisée (défaut 19 Hz)
sudo parca-agent \
--node=my-hostname \
--store-address=localhost:7070 \
--insecure \
--profiling-cpu-sampling-frequency=49
# Profiler uniquement des cgroups spécifiques
sudo parca-agent \
--node=my-hostname \
--store-address=localhost:7070 \
--insecure \
--profiling-cgroup-path=/sys/fs/cgroup/system.slice/my-service.service
# Désactiver le déroulement de pile du noyau
sudo parca-agent \
--node=my-hostname \
--store-address=localhost:7070 \
--insecure \
--profiling-disable-kernel
# Activer l'extraction d'informations de débogage
sudo parca-agent \
--node=my-hostname \
--store-address=localhost:7070 \
--insecure \
--debuginfo-upload-disable=false
Déploiement Kubernetes
# parca-server.yaml — Déployer le serveur Parca sur Kubernetes
# Appliquer avec : kubectl apply -f parca-server.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: parca
namespace: parca
spec:
replicas: 1
selector:
matchLabels:
app: parca
template:
metadata:
labels:
app: parca
spec:
containers:
- name: parca
image: ghcr.io/parca-dev/parca:latest
args:
- /parca
- --config-path=/etc/parca/parca.yaml
- --cors-allowed-origins=*
ports:
- containerPort: 7070
---
apiVersion: v1
kind: Service
metadata:
name: parca
namespace: parca
spec:
selector:
app: parca
ports:
- port: 7070
targetPort: 7070
# parca-agent-daemonset.yaml — Déployer l'agent Parca en DaemonSet
# Appliquer avec : kubectl apply -f parca-agent-daemonset.yaml
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: parca-agent
namespace: parca
spec:
selector:
matchLabels:
app: parca-agent
template:
metadata:
labels:
app: parca-agent
spec:
hostPID: true
containers:
- name: parca-agent
image: ghcr.io/parca-dev/parca-agent:latest
args:
- /parca-agent
- --store-address=parca.parca.svc:7070
- --insecure
- --node=$(NODE_NAME)
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
securityContext:
privileged: true
volumeMounts:
- name: sys
mountPath: /sys
readOnly: true
volumes:
- name: sys
hostPath:
path: /sys
# Déployer avec Helm
helm repo add parca https://parca-dev.github.io/helm-charts
helm repo update
helm install parca parca/parca -n parca --create-namespace
helm install parca-agent parca/parca-agent -n parca
Intégration pprof
# L'agent Parca peut collecter les endpoints pprof des applications Go
# Votre application Go expose /debug/pprof/ par défaut avec net/http/pprof
# Configurer les cibles de collecte via les annotations Kubernetes
# Ajouter à la spécification du pod :
# metadata:
# annotations:
# parca.dev/port: "6060"
# Ou configurer des cibles de collecte statiques dans parca.yaml
# parca.yaml avec configuration de collecte
object_storage:
bucket:
type: "FILESYSTEM"
config:
directory: "/var/lib/parca/data"
scrape_configs:
- job_name: "my-go-service"
scrape_interval: "15s"
static_configs:
- targets: ["my-service:6060"]
profiling_config:
pprof_config:
process_cpu:
enabled: true
path: "/debug/pprof/profile"
delta: true
memory:
enabled: true
path: "/debug/pprof/heap"
delta: true
goroutine:
enabled: true
path: "/debug/pprof/goroutine"
Requêtes de profils
# Accéder à l'interface web Parca sur http://localhost:7070
# Utiliser le constructeur de requêtes ou écrire des requêtes type PromQL
# Le langage de requête Parca supporte :
# - Sélection de profils par correspondance d'étiquettes
# - Sélection de plage temporelle
# - Sélection de type de profil (cpu, mémoire, goroutine, etc.)
# Exemples de requêtes dans l'interface :
# process_cpu:cpu:nanoseconds:cpu:nanoseconds{node="my-host"}
# memory:alloc_objects:count:space:bytes{job="my-service"}
Comparaison de profils
# Dans l'interface web Parca :
# 1. Sélectionner un profil dans la chronologie
# 2. Cliquer sur "Compare" pour activer le mode comparaison
# 3. Sélectionner un second profil d'une plage temporelle différente
# 4. Voir le flame graph différentiel
# Les flame graphs différentiels affichent :
# - Cadres rouges : augmentation de l'utilisation des ressources
# - Cadres verts : diminution de l'utilisation des ressources
# - Cadres gris : inchangés
Utilisation de l’API
# Requêter les profils via l'API gRPC
# Parca expose une API gRPC sur le même port que HTTP
# Installer grpcurl pour l'exploration de l'API
go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest
# Lister les services disponibles
grpcurl -plaintext localhost:7070 list
# Requêter les types de profils
grpcurl -plaintext localhost:7070 parca.query.v1alpha1.QueryService/ProfileTypes
# Requêter des profils
grpcurl -plaintext -d '{
"mode": "QUERY_MODE_MERGE",
"report_type": "REPORT_TYPE_FLAMEGRAPH_ARROW",
"query": "process_cpu:cpu:nanoseconds:cpu:nanoseconds{}"
}' localhost:7070 parca.query.v1alpha1.QueryService/Query
Dépannage
# Vérifier si eBPF est supporté
sudo bpftool prog list 2>/dev/null || echo "bpftool not available"
# Vérifier la version du noyau (4.18+ requis pour eBPF)
uname -r
# Vérifier les journaux de l'agent
journalctl -u parca-agent -f
# Vérifier le support BTF (requis pour CO-RE)
ls /sys/kernel/btf/vmlinux
# Tester la connectivité entre l'agent et le serveur
curl -s http://localhost:7070/api/v1/status
# Vérification de santé de l'agent
curl -s http://localhost:7071/healthz
Référence rapide
| Composant | Port par défaut | Fonction |
|---|
| Parca Server | 7070 | Stockage, requêtes, interface web |
| Parca Agent | 7071 | Agent de profilage eBPF |
| pprof endpoints | 6060 | Collecte de profils d’applications |
| Fonctionnalité | Description |
|---|
| Profilage eBPF | Profilage système complet sans instrumentation |
| Collecte pprof | Récupérer les profils depuis les endpoints Go/langages |
| Vue différentielle | Comparer les profils dans le temps |
| Filtrage par étiquettes | Requêter par nœud, pod, conteneur, job |
| Info de débogage | Résolution automatique des symboles |