Definește obiective de latență pe percentile (p50, p95, p99)

Subiect din roadmap-ul Bune practici: performanța backend · parte din „Măsurare și profilare”

Ignorarea latentei medii te face să crezi că totul merge bine, în timp ce utilizatorii tăi se confruntă cu timpi de așteptare insuportabili. O medie maschează cozile lungi de răspunsuri cauzate de GC, lock-uri sau I/O lent, ducând la o experiență utilizator (UX) proastă și la pierderea încrederii în sistem. Definirea obiectivelor pe percentili (p50, p95, p99) îți oferă o imagine realistă asupra experienței reale a utilizatorilor, nu doar a mediilor statistice.

Cum o aplici

  1. Alege metricile relevante: Latența la finalul cererii (end-to-end) este crucială pentru UX, iar latența internă (ex: timpul de execuție al unei funcții) pentru debugging.
  2. Stabilește SLAs/SLOs clare: Definește ținte specifice, ex: p95 < 200ms. Evită să folosești doar media.
  3. Instrumentează aplicația: Folosește librării care suportă agregarea statistică (histograme, percentili) direct în runtime sau exportă date către un sistem de monitoring.
  4. Monitorizează continuu: Configurează alerte pentru depășirea pragurilor de p95/p99, nu doar pentru erori 5xx.

Exemplu

În loc să calculezi doar media, utilizează instrumente care generează histograme.

Varianta greșită (doar media):

# Aici un singur request lent de 5 secunde distorsionează media
avg_latency = sum(latencies) / len(latencies) 

Varianta corectă (percentili): Utilizând Prometheus cu client library în Python/Go:

// Definim un histogram pentru latență
requestDuration := prometheus.NewHistogramVec(
    prometheus.HistogramOpts{
        Name:    "http_request_duration_seconds",
        Help:    "Duration of HTTP requests.",
        Buckets: prometheus.ExponentialBuckets(0.01, 2, 10), // 10ms -> ~5s
    },
    []string{"method", "endpoint"},
)

În interogări SQL/PromQL:

-- Corect: verificăm p99
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))

Cum verifici

  • Dashboards: Verifică graficele de percentili în Grafana sau Datadog. Asigură-te că linia p99 nu este aproape de media.
  • Load Testing: Rulează teste de încărcare (ex: k6, JMeter) și compară rezultatele cu SLOs definite.
  • Loguri de producție: Analizează logurile de tracing (OpenTelemetry) pentru a identifica request-urile care cad în coada p99.

Greșeli frecvente

  1. Folosirea exclusivă a mediei: Maschează problemele de scalabilitate și "noisy neighbors".
  2. Ignorarea p99: Un p95 bun poate asculta un p99 catastrofic care afectează o mică fracțiune critică de utilizatori sau tranzacții.
  3. Buckets incorecte în histograme: Dacă bucket-urile sunt prea largi sau nu acoperă domeniul real, calculul percentililor va fi imprecis.

Resurse gratuite

Alte subiecte din „Măsurare și profilare”