← На главную

Задержка в M/M/c при нагрузке 0.8 стремится к 1 секунде — очередь исчезает

19.06.2026 20:30 · hackernews

Система из c серверов, каждый обрабатывает один запрос за раз без внутренней очереди. Перед ними — балансировщик с бесконечной очередью. Клиенты отправляют в среднем c * 0.8 запросов в секунду — то есть нагрузка на сервер постоянна, а общая растёт линейно с c. Вопрос: как при этом меняется средняя задержка, которую видит клиент? Варианты: латентность падает и стремится к 1 секунде (время в очереди уходит в ноль), остаётся постоянной, улучшается линейно или линейно ухудшается.

В терминах теории очередей это система M/M/c: пуассоновский поток, экспоненциальное время обслуживания и c бэкендов. Классический результат — формула Эрланга для задержек (Erlang's C formula). Она считает вероятность того, что запрос встанет в очередь, а не обработается сразу. И график показывает: при половине насыщения (2.5 rps) для двух серверов вероятность очереди — 13%. Для пяти серверов при 5 rps — уже 3.6%. То есть система с большим c пропускает больше трафика без очереди при той же относительной нагрузке на сервер.

Правильный ответ на опрос в Twitter — вариант A: средняя задержка асимптотически стремится к 1 секунде. Симуляция Монте-Карло подтверждает: медиана (p50) идёт за средним, высокие перцентили (99-й и 99.9-й) ведут себя так же. Никаких скрытых проблем.

Для облачных сервисов это отличная новость. Чем больше c, тем ниже задержка при той же утилизации — или выше утилизация при той же задержке. И эффект заметен уже при небольших c. Проблем, которые становятся легче с ростом числа серверов, не так много, и это одна из них.

Насколько результат зависит от выбора 0.8 нагрузки? Практически не зависит — до тех пор, пока средняя интенсивность запросов не превышает число серверов (система стабильна при λ/(cμ) < 1). Допущения модели — пуассоновский поток и экспоненциальное время ответа — разумны, хотя для реальных сервисов время скорее логнормальное. Но, судя по всему, это не меняет общей картины.

Читать оригинал →