Latency и Throughput
Быстро и много — это разные характеристики
При обсуждении производительности часто говорят: «система должна быть быстрой». Но за этой фразой скрываются как минимум две разные характеристики — latency и throughput. Если их смешивать, можно оптимизировать не ту проблему.
Latency: сколько ждёт один запрос
Latency — это задержка от начала операции до получения результата. Например, пользователь нажал кнопку, запрос ушёл на сервер, и ответ пришёл через 80 мс. Для этого запроса latency составляет примерно 80 мс.
Request ──────────────→ Response
<--- 80 ms --->
В реальной системе задержка складывается из нескольких частей: сети, очередей ожидания, работы приложения, обращений к хранилищам и других операций. Поэтому ускорение одного компонента не всегда заметно улучшает итоговое время ответа.
Throughput: сколько работы проходит через систему
Throughput — это объём работы, который система обрабатывает за единицу времени. Для API это часто запросы в секунду, для очереди — сообщения в секунду, для хранилища — операции чтения или записи в секунду.
1 second
| Req | Req | Req | Req | Req | Req |
throughput = 6 req/s
Высокий throughput не гарантирует низкую latency. Система может обрабатывать тысячи запросов в секунду, но отдельный пользователь при этом будет ждать ответ заметно дольше.
Среднее значение может скрыть проблему
Если большинство запросов выполняется за 40 мс, а небольшая часть — за несколько секунд, обычное среднее не всегда покажет реальный пользовательский опыт. Поэтому latency часто смотрят через процентили: например, p95 означает, что 95% измеренных запросов завершились не медленнее указанного значения.
p50 = 45 ms
p95 = 180 ms
p99 = 700 ms
Такая картина сразу показывает «длинный хвост»: почти все запросы быстрые, но небольшая доля работает заметно хуже.
Оптимизация зависит от цели
Для интерактивного интерфейса обычно особенно заметна latency. Для фоновой обработки миллионов событий может быть важнее throughput. Часто нужны оба свойства, но архитектурные решения для их улучшения могут отличаться.