Что такое latency и throughput?

Что такое latency и throughput

Latency (задержка) — это время, которое проходит между отправкой запроса и получением соответствующего ответа или завершением операции. Её измеряют в единицах времени: миллисекунды (ms), секунды (s). Latency складывается из нескольких частей: сетевой RTT, время в очереди (queueing), время обработки на сервере (service time), время чтения/записи данных и т.д. Важно различать время обработки (service time) и end-to-end latency (включая очереди и задержки у зависимостей).

Ключевые понятия по latency:

  • p50 (медиана) — половина запросов быстрее этого значения.

  • p95 / p99 / p999 (перцентили) — 95%, 99% и 99.9% запросов быстрее этих значений; tail latency (хвост) часто критичнее среднего.

  • Среднее (mean) — чувствительно к выбросам; часто вводит в заблуждение.

  • Histogram / HDR-histogram — дают распределение задержек, позволяют корректно считать перцентили.

Почему хвостовая задержка важна: небольшая доля медленных запросов (p99) может создать заметные проблемы UX и сломать SLA, даже при хороших значениях p50.

Throughput (пропускная способность) — это количество операций/запросов, которые система обрабатывает за единицу времени. Единицы: запросы в секунду (req/s), транзакции в секунду (TPS), байты в секунду (B/s). Throughput показывает нагрузку и ёмкость системы.

Важные аспекты:

  • Пиковая vs устойчивая пропускная способность.

  • Throughput ограничивается узким местом (база данных, сеть, диск, CPU).

  • Увеличение нагрузки не всегда линейно повышает throughput — при насыщении ресурсами throughput может упасть или начать расти медленнее.

Взаимосвязь: Little’s Law (простая модель)

Little’s Law: L=λ×WL = \lambda \times W, где
LL — среднее число одновременно находящихся запросов (concurrency),
λ\lambda — throughput (req/s),
WW — средняя задержка (s).

Отсюда λ=L/W\lambda = L / W.

Пример расчёта (пошагово):

  • Пусть одновременно обрабатывается L=100L=100 запросов.

  • Средняя задержка W=200W = 200 ms.

  • 200 ms = 200÷1000=0,2200 \div 1000 = 0{,}2 s. (деление: 200/1000 = 0.2)

  • Тогда throughput λ=100÷0,2=500\lambda = 100 \div 0{,}2 = 500 req/s. (деление: 100/0.2 = 500)

Эта формула объясняет, почему при росте latency без увеличения параллелизма throughput падает, и наоборот — увеличение concurrency при той же задержке повышает throughput.

Точки конфликта и компромиссы

  • Бэтчинг и агрегация увеличивают throughput (больше работы за один вызов), но повышают latency для отдельных запросов.

  • Параллелизм повышает throughput, но может привести к контеншену ресурсов и росту latency (queueing).

  • Ретраи (повторные попытки) могут искусственно увеличить нагрузку и ухудшить и latency, и throughput.

  • Backpressure и rate-limiting помогают сохранить устойчивость, жертвуя частью throughput ради стабильного latency.

Что измерять и как улучшать

Метрики: p50/p95/p99 latency по эндпоинтам, successful req/s (throughput), CPU/memory/IO, queue depth, connection pool usage, error rate. Инструменты: APM, Prometheus (histograms), HDR Histogram, Jaeger/Zipkin (tracing), нагрузочное тестирование (k6, JMeter).

Способы улучшения: кэширование, сокращение критического пути, асинхронная обработка, пул соединений, горизонтальное масштабирование, оптимизация запросов к БД, CDN, контроль ретраев, внедрение backpressure и адаптивного rate-limiting.