Retour aux articles • CLOUD • • 3 min de lecture

Suite de tir de perf moderne : k6, Vegeta & ghz

Comparatif et architecture d'une boîte à outils moderne de tir de performance en 2026 : Grafana k6, Vegeta, ghz (gRPC), oha et Locust, avec piège de l'omission coordonnée.

Suite de tir de perf moderne : k6, Vegeta & ghz

En 2020, lorsque j’écrivais mon premier guide sur les tirs de performance d’Application Gateway, l’écosystème reposait souvent sur des outils lourds en JVM (JMeter, Gatling) ou mono-threadés en Node.js (Artillery).

En 2026, les architectures modernes mêlent APIs REST, flux gRPC, WebSockets et endpoints d’inférence IA en streaming SSE. Pour auditer efficacement un reverse proxy (Caddy, Envoy, Azure AppGW, GCP/AWS LB) sans que la machine d’injection ne devienne elle-même le goulot d’étranglement, voici la suite d’outils de tir de performance que j’utilise en production.

Architecture & Flux : Suite de tir de perf moderne : k6, Vegeta

1. Le comparatif de terrain : quel outil pour quel besoin ?

OutilLangage MoteurModèle d’injectionPoint fort majeurCas d’usage idéal
Grafana k6Go (scripté en JS)Boucle fermée (VUs) ou ouverte (constant-arrival-rate)Seuils SLO bloquants en CI/CD + export natif PrometheusValidation de release, parcours API multi-étapes
VegetaGoBoucle ouverte pure (taux d’arrivée constant)Insensible à l’Omission CoordonnéeStress test de reverse proxy L7 et WAF
ohaRust (tokio)Boucle ouverte / concurrence fixeTUI temps réel ultra-visuelle + correction de latenceDiagnostic instantané en ligne de commande
ghzGoConcurrence / RPS cibleSupport natif HTTP/2 + Protobuf / gRPC ReflectionMicroservices internes et moteurs d’inférence
LocustPythonUtilisateurs distribuésFlexibilité totale du code Python (auth complexe, SSE)Simulation de trafic applicatif réaliste

2. Le piège mortel des tests de charge : l’Omission Coordonnée (Coordinated Omission)

C’est l’erreur numéro 1 observée lors des audits de performance :

  • Dans un outil en boucle fermée (Closed-Loop classique où 50 utilisateurs virtuels attendent la réponse de la requête $N$ avant d’envoyer la requête $N+1$), si votre serveur gèle pendant 5 secondes à cause d’un Garbage Collection ou d’un verrou SQLite/NFS, les utilisateurs virtuels s’arrêtent d’envoyer des requêtes pendant la panne !
  • Résultat : le serveur est artificiellement soulagé et votre centile p95 paraît excellent alors que la production aurait subi un empilement catastrophique.

Avec k6 (via l’exécuteur constant-arrival-rate) ou Vegeta, l’injecteur maintient implacablement la cadence d’arrivée (arrivalRate), révélant la véritable dégradation perçue par les clients :

// Script k6 moderne (2026) : boucle ouverte à 500 req/s avec garde-fou SLO bloquant
import http from 'k6/http';
import { check } from 'k6';

export const options = {
  scenarios: {
    open_loop_stress: {
      executor: 'constant-arrival-rate',
      rate: 500,
      timeUnit: '1s',
      duration: '2m',
      preAllocatedVUs: 100,
      maxVUs: 1000,
    },
  },
  thresholds: {
    http_req_failed: ['rate<0.001'],      // Moins de 0,1 % d'erreurs tolérées
    http_req_duration: ['p(99)<250'],     // Le p99 doit rester sous 250 ms
  },
};

export default function () {
  const res = http.get('https://blog.ravindra-job.fr/');
  check(res, { 'status is 200': (r) => r.status === 200 });
}

3. Tester ses endpoints gRPC avec ghz

Lorsque vos services communiquent en gRPC (Protobuf sur HTTP/2), les outils HTTP/1.1 classiques sont inopérants. ghz permet de tirer directement à partir du contrat .proto ou par réflexion :

ghz \
  --proto ./proto/inference.proto \
  --call inference.Predictor/Predict \
  -d '{"prompt": "ping"}' \
  -c 50 -z 60s --rps 1000 \
  blog.ravindra-job.fr:443
Animation exécution CLI dans le terminal

Couplée à un export direct vers Prometheus (K6_PROMETHEUS_RW_SERVER_URL), cette boîte à outils permet de corréler à la seconde près la courbe d’injection avec la consommation CPU/RAM (cAdvisor) et la saturation d’IOPS du stockage.