Сервисная адаптивная защита от сброса нагрузки
цель дизайна
- Убедитесь, что система не перегружена чрезмерными запросами
- Обеспечьте максимально высокую пропускную способность на основе обеспечения стабильности системы.
Рекомендации по дизайну
- Как измерить загрузку системы
- Будь то виртуальная машина или контейнер, необходимо читать нагрузки, связанные с cgroup.
- Используйте 1000 м для представления 100% ЦП, а 800 м рекомендуется для представления высокой загрузки системы.
- Как можно меньше накладных расходов без значительного увеличения RT
- Вне зависимости от системных проблем БД или кэша, от которых зависит сам сервис, такие проблемы решает механизм прерывателя цепи
конструкция механизма
-
Используйте скользящее среднее значение при расчете загрузки ЦП, чтобы уменьшить нестабильность, вызванную дрожанием загрузки ЦП, см. Справочные материалы по скользящему среднему значению.
- Скользящее среднее должно принимать приблизительное среднее из предыдущих N последовательных значений, а значение N может быть определено с помощью гиперпараметра бета.
- Когда загрузка ЦП превышает указанное значение, срабатывает механизм защиты от снижения нагрузки.
-
Механизм временного окна, используйте механизм скользящего окна для записи QPS и RT (время ответа) в предыдущем временном окне.
- Скользящее окно использует 50 сегментов за 5 секунд, каждый сегмент сохраняет запросы в течение 100 мс и перерабатывает самые последние запросы поверх самых старых.
- При расчете maxQPS и minRT необходимо отфильтровать сегмент с самым последним неиспользованным временем, чтобы не допустить, что в этом сегменте всего несколько запросов, а RT находится на минимальном значении с малой вероятностью, поэтому при рассчитывая maxQPS и minRT, следуйте параметрам вышеуказанных 50 сегментов, считайте только 49
-
Запрос отклонен, если выполняются все следующие условия
-
Текущая загрузка ЦП превышает заданный порог, или время последнего отказа не превысило 1 секунду (период охлаждения). Период охлаждения предназначен для предотвращения увеличения нагрузки сразу же после того, как оно упадет, вызывая колебание вперед и назад, когда оно снова поднимается.
-
averageFlying > max(1, QPS*minRT/1e3)
-
averageFlying = MovingAverage(flying)
-
При расчете MovingAverage(flying) значение гиперпараметра beta по умолчанию равно 0,9, что означает, что вычисляется среднее значение пролетов первых десяти раз.
-
При определении летающей стоимости существует три подхода:
- После добавления запроса обновляется средний полет, см. кривую Orange
- Обновить средний полет один раз после завершения запроса, см. зеленую кривую на рисунке
- Обновить AverageFlying один раз после добавления запроса и обновить AverageFlying один раз после завершения запроса.
Мы используем второй, который может лучше предотвратить джиттер, как показано на рисунке:
-
QPS = maxPass * bucketsPerSecond
- maxPass представляет успешные запросы в каждом допустимом сегменте.
- BucketsPerSecond указывает, сколько сегментов в секунду
-
1e3 означает 1000 миллисекунд, единица измерения minRT также равна миллисекундам QPS*minRT/1e3 получает среднее количество одновременных запросов в каждый момент времени.
-
-
Использование сброса нагрузки
- Опциональная конфигурация активации была добавлена в фреймворки rest и zrpc.
- CpuThreshold, если установлено значение больше 0, активируется механизм автоматического снижения нагрузки сервиса
- Если запрос будет отклонен, в журнале ошибок будет
dropreq
ключевые слова
использованная литература
адрес проекта
Если вы считаете, что статья хорошая, добро пожаловатьgithubнажмитеstar🤝