Высоконагруженные приложения

Когда же начинается HighLoad?

Измерение нагрузки

Количество запросов в единицу времени

  • rps — requests per second
  • rpm — requests per minute

Чего тут не хватает?

  • Не учитывается объём трафика
  • Не учитывается latency
  • Не учитывается сложность/тяжелость запросов

Отслеживание аномалий запросов

  • Атаки DDoS
  • География запросов — MaxMind, whois
  • С каких адресов идут запросы, с одного IP-адреса или из одной подсети.
  • Много ли запросов из неожиданных стран
  • Аномальная динамика по дням недели

Инструменты

Парсинг логов, ELK, Grafana для визуализации

Пишите логи!

Логи должны быть структурные. С разными уровнями логирования.

Логи должны быть информативные, в них должны быть вся необходимая информация для анализа запроса.

Для микросервисов обязательно включать requestId — сквозной идентификатор запроса, который передаётся от одного микросервиса другому.

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

Количество данных в единицу времени

  • pps — packets per second
  • mps — megabytes per second

TCP_CORK, TCP_NODELAY, Buffering

Каждый пакет это прерывание и переключение контекста CPU. Каждое переключение занимает время и ресурсы процессора. При official websiteadditional infobest replica watches reviewphone cases with card holderelf baryokan vapeбольшом количестве потоков и переключений процессор больше тратит ресурсы на переключение контекстов в ущерб выполнения полезных вычислений прикладных программ.

В линуксе можно посмотреть информацию по переключению контекста процессора (context switching):

$ pid=307
$ grep ctxt /proc/$pid/status

Условная таблица с порядками времени выполнение различных операций «Числа, которые должен знать каждый программист«.

Количество одновременных соединений

  • Simultaneous connections
  • Concurrency

Длительные подключения WebSockets, Long-Polling

Проблемы одновременных соединений: c10k (wiki, habr), c100k, c1000k.

Инструменты

Логи, New Relic, Prometeus, Zabbix, okmeter.io

Для высоконагруженных приложений критичными является параметры

  • время обработки запроса (latency) — обработка запросов по одному, быстро обработали — быстро отдали
  • пропускная способность (throughput) — обработка запросов пачками, отдельный запрос будет ждать пока обработается вся пачка запросов

В реальных проекта приходится выбирать между этими параметрами.

В highload-системах, как правило, предпочтение отдают throughput.

Причины выбора — разные архитектуры

Что нужно мерить?

Правильно измерять перцентиль. Как правило 95 или 99.

Перцентиль (процент) — значение антропометрического признака для сотой доли совокупности измеренных людей.
Если кривую распределения всей совокупности измеренных людей разделить на 100 равных частей, то получим 99 площадей, в каждой из которых будет свое значение признака и частота ее встречаемости.

Для нас 99 персентиль означает что 99% запросов укладываются в требуемое значение.

Виды масштабирования

Вертикальное — увеличение мощности сервера.

Вертикальное масштабирование проще всего, просто добавить мощности серверам (памяти, процессоры, жесткие диски).

Однако невозможно бесконечно вертикально масштабироваться, всегда есть предел.

Не требует специальной архитектуры ПО, можно обойтись дешевыми программистами. Проще докупить «железа».

Горизонтальное — использование бОльшего количества серверов.

Требует специальной архитектуры ПО. Требует высокой квалификации программистов. Позволяет быстро наращивать производительность системы увеличивая количество серверов/узлов.

HighLoad это когда уже не хватает одного сервера и приходится задумываться о горизонтальном масштабировании системы.