# Автомасштабирование

> Как платформа добавляет экземпляры под нагрузку и что в этом можно настроить.

Раздел: Приложение
Источник: https://nodbox.ru/docs/apps/scaling/

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

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

## Масштабом управляют два числа

| Поле API | Название в панели | Что задаёт | Пределы | По умолчанию |
| --- | --- | --- | --- | --- |
| `max_instances` | Максимум экземпляров | сколько экземпляров приложение может держать одновременно | от 1 до 10 | 1 |
| `concurrency` | Запросов на экземпляр | порог одновременных запросов на экземпляр, после которого нужен ещё один | от 1 до 1 000 | 100 |

Числа читаются в паре. Максимум говорит, докуда приложение вырастет, порог - с какого места оно начнёт расти. При максимуме 1 порог ничего не меняет: расти некуда.

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

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

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

## Минимум задаёт сон

Отдельного поля для минимума нет. Минимум определяет сон, то есть поле `sleep_enabled`:

| Сон | Минимум | Что это значит |
| --- | --- | --- |
| включён | 0 | без запросов приложение уходит в ноль экземпляров и просыпается от первого запроса |
| выключен | 1 | один экземпляр работает круглосуточно |

Сон включён по умолчанию. Через сколько тишины приложение засыпает, от 60 секунд до часа, и сколько занимает пробуждение, разбирает страница [Сон и пробуждение](/docs/apps/sleep/).

Итоговый диапазон складывается из двух настроек: при включённом сне приложение держит от 0 до `max_instances` экземпляров, при выключенном - от 1 до `max_instances`.

## Настройки действуют со следующей версии

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

Чтобы новый максимум заработал, закажи версию или запушь в ветку с [автодеплоем](/docs/deploy/auto-deploy/). В панели для этого есть галка «Задеплоить после сохранения»: с ней кнопка «Сохранить» заодно заказывает версию. Подробнее о том, что хранит версия, - в разделе [Версии и откат](/docs/deploy/versions/).

## Как задать масштаб

В панели масштаб лежит на странице приложения, в настройках, в карточке «Сон и масштаб». Там четыре поля: переключатель «Засыпать без запросов», срок сна «Когда засыпать», «Запросов на экземпляр» и «Максимум экземпляров». У воркера остаётся только максимум. Под формой панель показывает, сколько места в лимитах проекта займёт выбранное сочетание размера и максимума, и предупреждает до нажатия «Сохранить», если места не хватает.

Через API поля задаются при создании приложения в `POST /api/v1/applications` и меняются в `PATCH /api/v1/applications/{id}`. Правится ровно то, что прислано. Для `PATCH` токену нужны права «деплоить» и «менять мощность». Все запросы и права описаны в разделе [API nodbox](/docs/automation/api/).

```json
{
  "sleep_enabled": true,
  "sleep_after_seconds": 900,
  "max_instances": 4,
  "concurrency": 50
}
```

Значение за пределами таблицы выше отвечает ошибкой `422`.

В ответе `GET /api/v1/applications/{id}` те же `max_instances` и `concurrency` показывают настройки приложения. Рядом лежат два поля о том, что происходит сейчас:

| Поле | Что отдаёт |
| --- | --- |
| `instances` | сколько экземпляров держит работающая версия сейчас; 0 у спящего приложения, пусто, пока платформа ещё не прочитала состояние |
| `cold_start` | сколько занял последний запуск экземпляра: `ms` и `at` |

Число экземпляров платформа читает раз в минуту, а пока в панели открыта карточка приложения - чаще. Время запуска измеряется с точностью до секунды, поэтому панель показывает его с оговоркой «около».

## Экземпляры проекта считаются вместе

Все приложения проекта делят общий запас места. Лимиты проекта по умолчанию такие:

- экземпляров до 12 на все приложения вместе
- процессора до 6 ядер
- памяти до 6 ГБ

Все цифры собраны в разделе [Лимиты и квоты](/docs/project/limits/).

Место считается по потолку, а не по тому, сколько экземпляров работает сейчас. Приложение размера Eco 512 МБ с процессором 0,5 ядра и максимумом 4 занимает в проекте 2 ядра и 2 ГБ памяти, даже когда спит или работает в одном экземпляре. Размер каждого экземпляра берётся из [размера приложения](/docs/apps/sizes/), поэтому проект с крупными размерами упирается в процессор и память раньше, чем в число экземпляров.

Из этого следует три правила:

- **Увеличение максимума проверяет квоту.** Если процессора или памяти не хватает, ответ - `403` с полями `quota`, `limit`, `usage` и `requested`. Приложение остаётся с прежним максимумом.
- **Снижение максимума место не освобождает до деплоя.** Работающая версия сохраняет прежний потолок, пока её не заменит новая.
- **Двенадцать экземпляров - общий потолок проекта.** Платформа держит место не больше чем под двенадцать экземпляров. Сумма максимумов всех приложений, в том числе спящих и остановленных, может выйти за эту границу: запрос не отклоняется, но лишние экземпляры не поднимутся. Следи, чтобы сумма максимумов не превышала 12.

## Что видно в панели

На странице приложения экземпляры нарисованы квадратиками: по одному на каждый, максимум показывает, сколько ещё может добавиться. У спящего приложения экземпляров ноль. Число обновляется само, перезагружать страницу не нужно.

В метриках приложения запросы суммируются по всем экземплярам. Процессор и память показывают самый нагруженный экземпляр, а не сумму и не среднее: карточка отвечает на вопрос, хватает ли приложению купленного размера, и отвечает на него худший экземпляр. Подробности - в разделе [Метрики приложения](/docs/observability/metrics/).

## Что не масштабируется

- **Размер.** Масштабирование добавляет экземпляры, но не делает их крупнее. Процессор и память одного экземпляра задаёт размер: [Размеры приложения](/docs/apps/sizes/).
- **Состояние экземпляра.** Каждый экземпляр - отдельная копия приложения со своей памятью и своей файловой системой. Данные в памяти и файлы, записанные на месте, другим экземплярам не видны, а два запроса одного пользователя могут попасть на разные экземпляры. Сессии, кэш и загруженные файлы держи в базе или во внешнем хранилище.
- **База данных.** База не растёт вместе с приложением: у неё свой размер и свой лимит соединений, а каждый экземпляр открывает соединения сам. Размеры баз описаны в разделе [Размеры и цена баз](/docs/databases/presets/).
- **Воркер.** У воркера нет адреса и запросов, поэтому у него нет ни порога, ни сна. Подробнее о том, чем воркер отличается от веб-приложения, - в разделе [Веб-приложения и воркеры](/docs/apps/types/).

## Размер называет цену одного экземпляра

Цена в каталоге размеров названа за месяц круглосуточной работы одного экземпляра. Пока приложение спит, оно не тарифицируется. Как в списаниях учитывается число поднятых экземпляров, описывает раздел [Тарификация](/docs/project/billing/).

## Что дальше

- [Сон и пробуждение](/docs/apps/sleep/) - минимум экземпляров и холодный старт
- [Размеры приложения](/docs/apps/sizes/) - процессор, память и цена одного экземпляра
- [Лимиты и квоты](/docs/project/limits/) - сколько экземпляров, процессора и памяти даёт проект
- [Метрики приложения](/docs/observability/metrics/) - запросы, процессор и память по экземплярам
- [Веб-приложения и воркеры](/docs/apps/types/) - чем воркер отличается от веб-приложения
