«Нам нужно это поддержать»

Недавно пришлось вспоминать, как считать необходимый размер ЗИП-склада. Казалось бы – чего там считать? А результат оказался не совсем интуитивным.

Дано:

  1. Планировали поставку 180 одинаковых сетевых коммутаторов производства одной из недружественных стран (назовем их условно Gin Berry, ягодки того самого куста).

  2. Заказчик попросил поддержку на 1 год с заменами Next Business Day.

  3. Вендорской поддержки нет (совсем).

Прилетает вопрос от коллеги: «Как думаешь, сколько нам нужно в ЗИП на год? 2-х коммутаторов наверное не хватит?»

Ладно, отложим в сторону вопрос обновлений, исправления багов и т.д. А что с заменами? Интуитивно кажется: ну ок, если всего 180, штук 6 за год сгорит точно – двух не хватит. С другой стороны, давно такое не считал, надо бы вспомнить методику.

Когда просят предсказать будущее сети без вендорской поддержки.
Когда просят предсказать будущее сети без вендорской поддержки.

Шаг 1. Исходные данные

Единственная цифра, которая у нас есть от производителя – это MTBF (Mean Time Between Failures). Для наших коммутаторов это, допустим, 250 000 часов.

Здесь пытливый ум может задаться вопросом – а что такое MTBF, что означает эта цифра? Значит ли это, что свич проработает 28 лет? Это маркетинг? Отчасти да, но проблема г��убже.

Чтобы понять физику процесса, представьте Город Студентов (любители Маркеса могут представить Макондо вскоре после того, как его основал Хосе Аркадио Буэндиа).

В этом городе живут только 20-летние. Никто не умирает от старости (до этого еще далеко). Но люди умирают от несчастных случаев. Статистика говорит: на 250 000 жителей приходится 1 несчастный случай в день (упал кирпич, ДТП и т.д.). Если поделить одно на другое, получится, что "среднее время между смертями" (MTBF) для жителя – 250 000 дней (685 лет). Значит ли это, что 20-летний студент проживет 685 лет? Нет. Он состарится и умрет в 80 (это его Lifetime, если медицина не придумает что-то радикальное).

Врет ли нам цифра MTBF? Нет. Цифра нужна, например, ритуальной службе не чтобы предсказать судьбу одного человека, а чтобы знать интенсивность потока смертей: «На каждые 250 000 жителей нужен 1 гроб в день».

Шаг 2. Считаем вероятность отказа одного устройства

Воспользуемся экспоненциальной моделью распределения отказов.

  • Год эксплуатации t = 8760 часов.

  • Интенсивность отказов \lambda = 1 / MTBF.

Вероятность того, что один конкретный коммутатор выйдет из строя за год:

P(t) = 1 - e^{-\lambda t}

Подставляем числа:

P(1 \text{ год}) = 1 - e^{-\frac{8760}{250000}} \approx 1 - e^{-0,035} \approx 3.44\%

Вывод: Каждый коммутатор имеет шанс 3,4% «отъехать» в течение года.

График показывает, как со временем нарастает риск отказа.
График показывает, как со временем нарастает риск отказа.

Шаг 3. Масштабируем на количество

У нас парк из 180 устройств. Чему равно математическое ожидание (среднее ожидаемое количество) отказов?

E = N \times P = 180 \times 0,0344 = 6.19

Округлим до 6,2 отказов в год.

Многие на этом останавливаются. «Ага, в среднем сгорит 6 штук. Значит, и на склад берем 6 штук». Это ошибка, так делать не стоит.

Среднее значение означает, что в 50% случаев вам этого хватит, а в 50% - нет. Если сгорит 7, 8 или 10 устройств - вы сорвали SLA и испортили репутацию. Нам нужен запас прочности.

Шаг 4. Добавляем паранойи

Поскольку отказы – события редкие и (в идеале) независимые, поток отказов подчиняется распределению Пуассона.

Нам нужно найти такое число запасных частей (k), чтобы вероятность того, что реальное число отказов не превысит k, была достаточно высокой (например, 95% или 99%).

Для распределения Пуассона стандартное отклонение (\sigma) равно корню из матожидания:

\sigma = \sqrt{E} = \sqrt{6,2} \approx 2.5

Применим правило «двух сигм». Диапазон E + 2\sigma в нормальном распределении (к которому стремится Пуассон) покрывает правую часть "хвоста" событий с вероятностью около 97.5%.

Считаем необходимый ЗИП:

N = E + 2\sigma = 6,2 + 2 \times 2,5 = 11.2

Округляем до целого — 11 устройств.

Проверим по кумулятивной функции распределения Пуассона (Poisson CDF) при \mu = 6{.}2:

P(X\le 10)\approx 94{,}9\%,

P(X\le 11)\approx 97{,}5\%.

Отлично! С 11 устройствами мы покрываем риски на 97,5%.

Визуализация наших рисков. Зеленая зона – запас на складе.
Визуализация наших рисков. Зеленая зона – запас на складе.

Итоговый вердикт

В ответ на запрос коллеги я ответил следующее:

  • Матожидание потерь в год: 6 устройств.

  • Необходимый запас на год (с учетом рисков): 11 устройств.

Вывод: Если мы положим на склад 11 штук, то с вероятностью 97,5% мы пройдем год без проблем с нехваткой оборудования.

Инженер объясняет менеджеру, почему нужно купить в ЗИП 11 свичей, когда сломаться должно только 6.
Ин��енер объясняет менеджеру, почему нужно купить в ЗИП 11 свичей, когда сломаться должно только 6.

Нюансы реального мира

Конечно, наш "метод Ванги" имеет свои ограничения, о которых стоит помнить:

  • Bathtub Curve (U-кривая): В первый год эксплуатации интенсивность отказов может быть выше из-за заводского брака. MTBF не факт, что это учитывает, но на практике начало эксплуатации самое опасное. Лет через 7 со старением оборудования интенсивность отказов тоже будет возрастать.

  • Зависимые отказы: Если в серверной скакнет напряжение и выжжет половину стойки, никакой ЗИП по Пуассону вас не спасет.

  • Человеческий фактор: Кривые руки в формулу тоже не заложены.

Но такой расчет в любом случае лучше, чем "пол, палец, потолок". Он дает обоснованную цифру для бюджета и понимание уровня риска.

Пуассон задумчиво смотрит на стойки с оборудованием, в которых только что выгорело одновременно 7 свичей.
Пуассон задумчиво смотрит на стойки с оборудованием, в которых только что выгорело одновременно 7 свичей.

P.S.

Для тех, кто Python любит больше, чем калькулятор:

from scipy.stats import poisson
import math

n = 180
mtbf = 250000
hours = 8760

mu = n * (1 - math.exp(-hours/mtbf)) # Это матожидание
target_prob = 0.975
k = poisson.ppf(target_prob, mu)

print(f"Ожидаем отказов: {mu:.2f}")
print(f"Нужно устройств для {target_prob*100}% надежности: {int(k)}")