АрхитектураНадёжность и производительностьИнженер по надёжности платформы

Автоскейлер то добавляет, то убирает реплики при почти неизменной нагрузке. Какой механизм управления предо...

Автоскейлер то добавляет, то убирает реплики при почти неизменной нагрузке. Какой механизм управления предотвращает такие колебания?

Проходите собеседования с ИИ помощником Hintsage

Краткий ответ

Колебания предотвращают гистерезис и стабилизационные задержки: масштабирование вверх и вниз выполняют по разным порогам, а после изменения числа реплик некоторое время не принимают новое решение. Это не даёт кратковременному изменению метрики немедленно запускать противоположное действие.

Исторический контекст

Простые правила автоскейлинга появились как реакция на необходимость автоматически поддерживать производительность без постоянного ручного изменения числа экземпляров. Однако система, которая немедленно реагирует на каждое пересечение одного порога, ведёт себя как нестабильный регулятор.

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

Постановка проблемы

Предположим, автоскейлер добавляет реплики при загрузке выше 70% и удаляет их при загрузке ниже 70%. Из-за задержки запуска экземпляров и сглаживания метрик система может принимать решения по устаревшему состоянию.

Частые изменения числа реплик расходуют ресурсы, создают дополнительную нагрузку на планировщик и балансировщик, прогревают кэши заново и могут ухудшать задержку вместо её стабилизации. При слишком агрессивном уменьшении масштаба система также рискует не успеть обработать следующий всплеск нагрузки.

Подробное решение

Гистерезис задаёт разные пороги для противоположных действий. Например, масштабирование вверх выполняют при устойчивом превышении верхнего порога, а вниз — только после снижения метрики существенно ниже него. Небольшие колебания около границы тогда не меняют решение.

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

Важно учитывать задержку готовности экземпляров. Если реплика начинает принимать трафик через несколько минут, автоскейлер должен оценивать эффект уже запущенного масштабирования, иначе он может добавлять новые реплики до того, как предыдущие начали помогать.

Порог следует выбирать относительно целевой производительности, а не только относительно CPU. При очередях полезнее учитывать длину очереди или время ожидания, но эти метрики также нужно сглаживать и защищать от реакции на кратковременные выбросы.

Компромисс состоит в том, что сильный гистерезис и длинное окно стабилизации уменьшают дрожание, но замедляют реакцию на реальные изменения нагрузки. Слишком короткие задержки повышают чувствительность, но увеличивают риск колебаний; слишком длинные могут привести к временной деградации до завершения масштабирования.

Ситуация из практики

Сервис обрабатывает неравномерный поток запросов. Автоскейлер масштабирует его вверх при превышении средней загрузки CPU, но почти сразу после запуска новых реплик уменьшает их число. Причина — новые экземпляры ещё не успели прогреться, а метрика CPU уже изменилась.

Рассматривались три варианта. Масштабирование только по CPU было простым, но реагировало на косвенный сигнал. Увеличение частоты проверок ускоряло реакцию, однако усиливало колебания. Полное отключение автоматического уменьшения устраняло дрожание, но приводило к постоянному перерасходу ресурсов.

Выбрали масштабирование вверх по сглаженной метрике нагрузки, отдельный более низкий порог для уменьшения, окно стабилизации и задержку после добавления реплик. Это увеличило время реакции на небольшое снижение нагрузки, зато парк экземпляров перестал постоянно переключаться, а задержка оставалась предсказуемой.

Что кандидаты часто упускают

  1. Почему одного периода охлаждения недостаточно для устранения колебаний?

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

  1. Почему масштабирование по средней загрузке может не защищать задержку?

Среднее значение скрывает перегруженные экземпляры и хвост распределения. Часть запросов может попадать на очередь или горячий ключ, пока средняя загрузка остаётся нормальной. Для защиты пользовательского SLO иногда лучше использовать длину очереди на экземпляр, время ожидания или долю запросов, нарушающих целевую задержку, но эти сигналы должны быть достаточно устойчивыми.

  1. Почему после добавления реплик нагрузка может не уменьшиться?

Новые экземпляры не помогут, если узкое место находится в общем ресурсе: базе данных, внешней зависимости, ограниченном пуле соединений или последовательном участке обработки. В таком случае автоскейлер увеличит число потребителей, но общий ресурс останется ограниченным, а конкуренция за него может усилиться. Масштабирование следует проверять по изменению пропускной способности и задержки, а не только по числу реплик.