@Sazoks

Почему система падает при большом трафике?

Вопрос
Я бэкенд разработчик. Изучаю распределенные системы и принципы их проектирования. Задался вопросом: а как, собственно, происходят сбои в системах, когда, допустим, на них льется много трафика? Ведь именно из-за этого мы и проектируем системы так, чтобы они были высокодоступные? Я бы не хотел просто заучить CAP, BASE, PACEL и другие теоремы/принципы/свойства. Я бы хотел ПОНЯТЬ СУТЬ. И после некоторых размышлений пришел к такому вопросу.

Также у меня есть собственные дилетантские выводы. Опишу их ниже. Если это хотя бы похоже на правду, прошу, дайте знать.

Моя теория
Все базируется на формуле I = V * t, где I - объем информации (бит), V - скорость передачи информации по сети (бит/с), t - время в секундах.
Также я узнал про буфер в сетевых картах. Все запросы в любом случае идут через какой-то сетевой интерфейс, а значит 100% попадают в их буфер, т.к. должны где-то какое-то время храниться.
Ну и также я предположил, что процесс (программа) может считать данные из сокета (т.е. взять из сетевого буфера) и загрузить их в ОЗУ для дальнейшей обработки. Не факт, что программа сразу начнет их обработку.

В итоге, у меня получилась такая система.
659e93739c181868109025.png

Опишу все по порядку:
  1. W - скорость записи, входящий трафик, бит/сек.
  2. X - кол-во запросов в секунду. Здесь не уверен, как правильно считать W. Написал как понял сам.
  3. v(r) - средний объем запроса, биты. Грубо говоря, если у нас 1000rps (запросов в секунду) на какой-то эндпоинт, и в среднем 1 запрос = 2Кб, тогда нагрузка в бит/сек W = 1000 * (2 * 1024 * 8). Знаю, формулы дилетантские, поэтому и обращаюсь за помощью к сообществу.
  4. R - скорость считывания данных из буфера сетевой карты (или из ОЗУ, если данные перенесены туда). По сути, равна сумме производительности всех процессов, занимающихся обработкой данных. В простейшем случае есть 1 процесс (n = 1), обрабатывающий данные, бит/сек.
  5. P(i) - производительность процесса, бит/сек.
  6. V(Wt) - объем записанных данных за t сек, биты
  7. V(Rt) - объем считанных (обработанных) данных за t сек, биты
  8. V(max) - объем сетевого буфера/ОЗУ


Графическое представление для наглядности
659e967daf4d6139221646.png

Выводы из всего этого
  1. Если V(w) > V(max), тогда либо забьется буфер и некоторые сетевые пакеты будут отброшены, либо, подозреваю, забьется ОЗУ и сервис упадет.
  2. Если R < W (т.е скорость потребления и обработки информации меньше, чем входящий трафик), то рано или поздно случится V(w) > V(max) (см. пункт 1).


Напоминаю, что я полнейший дилетант, который очень поверхностно знает теорию компьютерных сетей. Я скромный бэкенд-разработчик, который хочет ПОНЯТЬ СУТЬ. Почему мы заботимся о производительности, о доступности наших систем. Увидеть воочию пользу load balancer'ов, паттернов по типу CQRS и прочих подходов.

Заранее благодарю.
  • Вопрос задан
  • 235 просмотров
Решения вопроса 1
AshBlade
@AshBlade
Просто хочу быть счастливым
Описание проблемы проще чем кажется: чем больше трафика - тем больше работы.
Это влечет за собой:
- Больший нагрев процессора и других комплектующих + повышение их износа -> могут отвалиться
- В каждом софте (даже стабильной ОС) есть ошибки, которые точно возникнут согласно ЗБЧ
- Появляется слишком много прерываний, которые тормозят систему -> большие операционные издержки (переключение контекста, переход в режим ядра и т.д.)
- Рано или поздно доступные ресурсы закончатся (ОЗУ, Диск, буфер сетевой карты), а не многие приложения могут такое обработать и упадут

Подытоживая: сбои происходят из-за того, что для обработки нагрузки требуется больше ресурсов чем есть.

Сколько ресурсов должно быть для корректной работы при определенной нагрузке надо искать самим - тестировать систему (стресс/нагрузочное/объемное и т.д.).
Создавать математические формулы - такое себе, т.к. слишком много важных параметров не будет учтено:
- Топология сети
- Используемые комплектующие
- Охлаждение
- Расположение серверов
- Версия ОС + гипервизор

UPD: + конечно же когда много трафика, то какие-то пакеты отбрасываются/теряются и необходимо слать их повторно, что увеличивает нагрузку на сеть + задержку запроса
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы