При решении реальных задач по System Design или при прохождении собеседования, обязательным этапом является расчет нагрузки и стоимости на вашу IT-Систему. Давайте разберемся что это за этап и почему он так важен?
Зачем нужен расчет нагрузки?
1. Определение требований к инфраструктуре
Сколько серверов, ядер CPU, оперативной памяти, дискового пространства и пропускной способности сети потребуется.
Пример:
Если система должна обрабатывать 10000 RPS, а один сервер выдерживает 1000 RPS, то нужно 10+ серверов (с учетом запаса).
2. Предотвращение перегрузки и отказов
Без расчета можно столкнуться с ситуацией, когда система падает под пиковой нагрузкой (например, во время Black Friday).
Пример:
Если не учесть пиковый фактор, серверы не справятся с наплывом пользователей.
3. Оптимизация архитектуры
Позволяет выбрать правильные технологии (например, SQL vs NoSQL, кеширование, шардинг).
Пример:
Если система read-heavy (в основном используется для чтения данных, а не для записи), выгоднее использовать Redis + репликацию БД, а не мощные SQL-серверы.
4. Планирование масштабирования
Горизонтальное (добавление серверов) vs вертикальное (апгрейд железа).
Пример:
Если нагрузка растет линейно, можно использовать автоскейлинг (автоматическое масштабирование ресурсов IT-инфраструктуры) в облаке (виртуальное пространство, где хранятся и обрабатываются данные).
Зачем нужен расчет стоимости?
1. Бюджетирование и экономическая эффективность
Нельзя проектировать систему, которая будет стоить $1M/месяц, если бизнес−модель рассчитана на $100K прибыли.
Пример:
Выбор между облаком и bare-metal - услуга аренды выделенного физического сервера (облако гибче, но дороже на больших масштабах).
2. Сравнение архитектурных решений
Иногда более сложное решение (например, Kafka вместо RabbitMQ) оправдано, если оно дешевле в долгосрочной перспективе.
Пример:
S3 хранилище против своей файловой системы – S3 проще, но при больших объемах своё хранилище может быть дешевле.
3. Избежание "дорогих" ошибок
Некоторые технологии имеют скрытые затраты.
Пример:
DynamoDB с оплатой за запросы может разорить при высокой нагрузке
4. Обоснование инвестиций
Если система требует $500к/год, нужно понять, окупится ли она.
Пример:
Кеширование через Redis может снизить нагрузку на БД и сэкономить $200к/год на серверах.
Что будет, если пропустить этот этап?
1. Система упадет при нагрузке (например, нехватка CPU/RAM под пиком).
2. Переплата за ресурсы (например, аренда мощных серверов "на всякий случай").
3. Невозможность масштабирования (например, БД без шардинга упрется в лимиты).
Расчет нагрузки и стоимости — это баланс между производительностью и затратами. Без него система либо не справится с нагрузкой, либо разорит компанию неоптимизированными расходами.
Приступим к расчетам:
Пользовательский трафик
Как прикинуть нужный объём трафика? Грубо говоря, надо понять:
1. Кто будет пользоваться системой?
Если это внутренний корпоративный сервис, то считаем по числу сотрудников + запас на новых.
Если публичный сайт, то смотрим, сколько людей сидит на аналогичных площадках.
2. Что они там будут делать?
Сколько времени в день проводят в системе?
Какие файлы загружают/скачивают (фото, видео, документы)?
Сколько места это займёт на серверах?
Пример:
Соцсеть для 1000 пользователей:
Каждый заливает по 5 фото в день (10 МБ) → 50 ГБ трафика в день.
Плюс хранение: 50 ГБ × 30 дней = 1.5 ТБ в месяц.
RPS
Давайте зафиксируем основную метрику, которая поможет в расчете нагрузки со стороны пользователей. Ссылаясь на пользовательский трафик, мы можем рассчитать RPS (Requests Per Second) - количество запросов в секунду. Рассчитывается по формуле:
где - количество уникальных пользователей за день,
- количество секунд в выбранном диапазоне,
- среднее число запросов на пользователя в день,
- пиковый коэффициент (опционален). По аналогии можно считать и для MAU и WAU.
Пример:
Дано:
=
активных пользователей в день.
Каждый пользователь делает
запросов за день =
(например, 10 страниц × 5 API-запросов).
Пиковый коэффициент =
=
(в час-пик нагрузка в 5 раз выше средней).
В дне
= 86400 секунд.
Расчет:
Средний RPS за день:запросов/сек.
Пиковый RPS:
запросов/сек.
Вывод: Сервер должен выдерживать в самые загруженные моменты.
Сетевой трафик
Сетевая нагрузка - объем трафика (данных, передаваемых по сети) за определенный период времени, а также степень использования сетевых ресурсов (например, пропускной способности или скорости связи). Это важный параметр для оценки производительности и эффективности сети, а также для планирования её масштабирования и расчета нагрузки и стоимости.
Приведем аналогию. Сетевая нагрузка - это, если как пропускная способность моста:
Сколько машин одновременно могут ехать (ограничения по соединениям)
Сколько тонн груза пропустит мост за час (объём трафика)
Ограничения по соединениям
Современный сервер — это как диспетчер на мосту: Обычный сервер может выдержать 10K-100K одновременных подключений.
Пример:
Nginx на 8 ядрах держит ~50K соединений
Проблема: Каждое новое соединение требует ресурсов CPU/RAM, следовательно при 100K+ одновременных подключениях нужны:
Оптимизация (epoll/kqueue). epoll и kqueue – это системы для управления файловыми дескрипторами, которые позволяют программам эффективно ожидать и обрабатывать события ввода-вывода. kqueue – это механизм, используемый в операционных системах BSD (FreeBSD, OpenBSD, macOS), а epoll – в Linux
Кластеризация (использование нескольких серверов).
Отразим формулу для расчета количества одновременных соединений - CCU (Concurrent Users):
где - число пользователей, одновременно активных на сервере. (теоретический максимум),
- количество активных пользователей за день,
- Среднее время сессии - как долго пользователь находится в системе (например, 10 минут),
- Среднее время активности в день - общее время работы сервиса (например, 24 часа = 1440 минут),
- пиковый коэффициент - во сколько раз нагрузка выше средней, например x2–x 5 (опционален).
Пример:
Дано:
= 50 000 пользователей,
Средняя сессия =
= 15 минут,
Сервис работает 24 часа (
= 1440 минут),
= 3.
Расчёт:
Количество одновременных соединений:
соединений.
Пиковый
:
соединений.
Вывод:
В пиковые часы сервер должен выдерживать одновременных соединений.
Стоимость
Можно взять в расчет, то что в данный момент средняя цена одного сервера от 1500$ до 4000$. И такой сервер можно выдерживать до 100К активных соединений.
Объем трафика
Тут есть 3 основных понятия, которые связаны с кол-вом информации, которая проходит по сети: Пропускная способность, сетевой трафик и нагрузка на сетевой канал. Давайте рассмотрим их по отдельности
1. Пропускная способность
Максимальная скорость канала (пропускная способность) — максимальное количество информации, которое можно передать по каналу связи за единицу времени. Аналогия: сколько «полос» на этом мосту. Измеряется в мегабитах в секунду (Мбит/с) или гигабитах (Гбит/с).
Пример:
Домашний интернет 100 Мбит/с = ~12.5 МБ/с реальной скорости. (Так как в одном байте 8 бит, то для перевода из Мбит в МБ необходимо разделить число на 8)
Серверный канал 1 Гбит/с = ~125 МБ/с.
Аналогия: Ширина шоссе: 2 полосы (100 Мбит/с) vs 8 полос (1 Гбит/с).
Рассмотрим популярные технологии для передачи данных:
1. Витая пара (Cat6) с пропускной способностью 10 Гбит/с. Используется в Офисах и дата-центрах. Стоимость 0.5$/метр
2. Оптоволокно с пропускной способностью 40-100 Гбит/с. Используется для магистральных каналов. Стоимость 10000$/порт
3. Infiniband — высокоскоростная коммутируемая компьютерная сеть, используемая в высокопроизводительных вычислениях,
имеющая очень большую пропускную способность и низкую задержку. Пропускная способность 200+ Гбит/с. Используется для супермпьютеров. Очень дорого.
Чтобы понять, подходит ли выбранная Пропускная способность для нашей системы, необходимо просчитать скорость, с которой сервер может отдавать данные для решения текущих задач. Тут появляется новая сущность как Пиковая нагрузка на сеть, которая отражает какой трафик проходит по нашей системе за единицу времени:
где - Пиковая нагрузка на сеть (бит/с),
- средний размер одной единицы данных (например размер лога, сообщения, записи в БД) в Б, КБ, МБ и тд.
Чтобы перевести КБ, МБ, ГБ в Кбит, Мбит, Гбит - необходимо умножить на 8 (так как в 1 Байте 8 Бит).
Пример:
Дано:
= 500 запросов/сек.
Каждый запрос имеет средний размер 1КБ (
= 1КБ)
При ответе система отвечает данными по 5КБ (
= 1КБ)
Пиковый коэффициент не учитываем.
Решение:
Входящий трафик:
Исходящий трафик:
Суммарный трафик:
Вывод:
Для нашей системы пиковая нагрузка на сеть составляет 24 Мбит/сек.
Пиковая нагрузка на сеть в свою очередь сравнивается с Пропускной способностью и конечно не должна превышать ее. Тут мы как раз и определяем, справляется ли наша система с трафиком и принимаем решение об повышении Пропускной
способности нашего канала.
Сетевой инстанс
Тут речь заходит о Сетевом инстансе - это виртуальный или физический сервер, настроенный для обработки сетевых запросов (например, веб-трафика, API, загрузки файлов). Его ключевая характеристика — Пропускная способность сети (измеряется в Гбит/с), которая определяет, сколько данных он может передавать/принимать в секунду.
Роль: Обрабатывает входящий трафик, распределяет нагрузку, защищает систему.
Аналогия: Дорожная полиция — управляет потоком данных, но не занимается их содержанием.
Стоимость
Считаем что 1 сетевой инстанс в среднем имеет пропускную способность 1Гбит/сек и стоит около 300$ в месяц.
Пример:
Рассмотрим пример выше где наша расчеты показали, что пиковая нагрузка на сеть составляет 24Мбит/сек. - это значит что нам потребуется 1 сетевой инстанс с пропускной способностью 1Гбит/сек за 300$. Если бы например= 1.5Гбит/сек., то это бы означало, что нам необходимо иметь 2 сетевых инстанса на 2Гбит/сек за 600$.
2. Сетевой трафик
Сетевой трафик - это фактический объём переданных данных — сколько «груза» проехало по дороге за определенное время. Считаем в гигабайтах (ГБ) или терабайтах (ТБ) за период (день/месяц). Считается так - общий объем информации который проходит по сети (на запись и чтение).
Пример:
Вы скачали фильм (5 ГБ) → ваш трафик +5 ГБ.
Сервер отдал 1000 пользователям по 1 МБ → 1 ГБ трафика.
Аналогия:
Количество машин, проехавших по шоссе за месяц.
Пример для сервиса ссылок:
1 млн переходов в месяц.
Каждая страница редиректа весит 10 КБ (HTML + скрипты).
API-запросы (создание ссылок) — 5 КБ на операцию (100 тыс. созданий).
Расчёт:
Переходы: 1 000 000 × 10 КБ = 10 000 000 КБ ≈ 10 ГБ.
API: 100 000 × 5 КБ = 500 000 КБ ≈ 0.5 ГБ.
Итого: 10.5 ГБ/мес.
Формула расчета сетевого графика:
где - сетевой трафик за выбранный промежуток времени (Байт),
- количество операций/событий в единицу времени (например в день),
- средний размер одной операции в Байтах (например размер лога, сообщения, записи в БД).
Пример:
Дано:
В день
= 1000000 запросов в систему
Средний размер запроса 10КБ
Средний размер ответа 2КБ
Необходимо посчитать сетевой трафик за день и месяц при неизменном количестве запросов к системе за этот период.
Решение:
Так как одному запросу к систему соответствует и запрос с 10КБ и ответ с 2КБ, значит на 1 обращение к системе приходится 12КБ сетевого трафика.
Общий объем сетевого трафика за день
ГБ в день.
Расчетаем сетевой трафик за месяц (30 дней):
ГБ за месяц.
Вывод:
За день в нашей системе сетевой трафик составляет 12 ГБ, а за месяц 360 ГБ.
Стоимость
Зафиксируем, как мы будем считать итоговую стоимость трафика. Обычно для облачные провайдеры продают свои услуги по цене до 0.1$ за 1ГБ трафика.
Таким образом расчитав сетевой трафик на горизонте определенного времени можно вычислить сумму, которую придется заплатить. Таким образом обращаясь к нашему примеру в месяц расходуя 360ГБ графика мы потратим 360 * 0.1 = 36$.
3. Нагрузка на сетевой канал
Нагрузка на сетевой канал - это насколько канал загружен в реальном времени — процент использования «полос» моста. Считают в % от пропускной способности:
где - нагрузка на сетевой канал,
- Пиковая нагрузка на сеть,
- пропускная способность.
Пример:
Канал 1 Гбит/с, текущий трафик 500 Мбит/с, следовательно Нагрузка на сетевой канал 50%.
При 90%+ начинаются проблемы (лаги, потери пакетов) и нужно срочно расширять канал добавляя сетевые инстансы.
Аналогия: Пробка на дороге: если машины занимают все полосы, движение замедляется.
Пример
Канал сервера: 100 Мбит/с.
Пиковый трафик: 60 Мбит/с (в час-пик).
Расчёт:
Вывод: Канал загружен на 60% — запас есть.
Пример:
У вас есть канал 1 Гбит/с (пропускная способность).
Сейчас через него идёт 600 Мбит/с трафика (пиковая нагрузка на сеть), следовательно нагрузка 60%.
Если трафик вырастет до 900 Мбит/с (90% нагрузки) — возможны провисания.
При 1 Гбит/с+ (100%+) — коллапс (потеря пакетов, обрывы).
Итог
Считаем заранее:
- количество запросов в секунду.
- количество одновременных соединений (Сразу можем прикинуть количество серверов по количеству одновременных запросов и лимиту одного сервера)
- пиковая нагрузка на сеть. (Сразу можно рассчитать количество сетевых инстансов и общую стоимость)
- сетевой трафик. (Сразу можно рассчитать стоимость графика для промежутка времени работы нашей системы)
- нагрузка на сетевой канал.
Спасибо за внимание!
PS
Если вам понравилась эта статься (я пойму это по реакции), то в ближайшее время выйдет новый материал, где мы обсудим как считать нагрузку на хранилище.
PPS
Если вы хотите не только быстро расчитывать нагрузку и стоимость вашей системы, но и принимать взвешенные архитектурные решения, которые выдержат миллионы пользователей и не сломаются при первой же проблеме. С гордостью представляю вам свой новый курс: C нуля до проектирования систем уровня senior-инженера.. Специально для Habr действует промокод 20% HABR20 . Этот курс — не просто сборник советов для собеседований. Это ваш путь от базовых концепций до проектирования сложных, высоконагруженных систем, которые работают в условиях реального мира. Здесь нет «волшебных таблеток» — только глубокое понимание принципов, разбор реальных кейсов и практика.