В теории массового обслуживания есть очень простая и удобная модель M/M/1:
Есть бесконечный поток задач, один узел обслуживания и очередь перед ним
поток задач -> очередь -> узел обслуживания
Где:
• поток задач описывается Пуассоновским процессом
• время обслуживания описывается экспоненциальным распределением
Интересно вот что: если взять
• λ — скорость прихода задач
• μ — скорость обработки
• ρ = λ / μ — утилизация
• W — среднее время в системе
То получается, что
• W = 1 / (μ - λ)
(proof)
И если переписать через утилизацию:
• W = 1 / μ(1 - ρ)
То есть среднее время нахождения задачи в системе растет гиперболически относительно утилизации. Возьмем простой пример: μ = 1 задача / день
И по формуле выше получаем такое среднее время нахождения задачи в системе W:
50% utilization -> 2 дня
80% utilization -> 5 дней
90% utilization -> 10 дней
95% utilization -> 20 дней
99% utilization -> 100 дней
Такое происходит из-за того, что задачи поступают в систему неравномерно. Поэтому если обработчик загружен под 100%, то любая неравномерность приводит к скоплению очереди, и как следствие, взрыву времени ожидания
Например, при переходе 95% -> 99% утилизация выросла всего на 4п.п., при этом среднее время ожидания скакнуло с 20 дней до 100 дней
На произвольные распределения этот эффект обобщается формулой Кингмана
—
Какой из этого можно сделать практичный вывод? Не хочешь внезапных задержек — оставляй исполнителям задач некоторый запас капасити
Например, разработчик загружен на 100%, он сидит, работает себе, а потом ему прилетают 3 пулреквеста на ревью. И 3 задачи встанут, потому что у разработчика нет капасити на то, чтобы их поревьюить. Ну и в такой ситуации обычно начинают браться в работу новые задачи, начинает раздуваться WIP, и проявляться прочие спецэффекты, описанные в этом посте
