Разделы документации
Автомасштабирование
Как платформа добавляет экземпляры под нагрузку и что в этом можно настроить.
Платформа считает одновременные запросы и добавляет экземпляр, когда на один приходится примерно столько запросов, сколько задано порогом. Экземпляры растут до максимума, который ты выбрал, и убираются, когда становится тише. По умолчанию максимум равен одному, поэтому масштабирование начинается с того, что ты поднимаешь максимум.
Экземпляр - одна запущенная копия приложения. Все экземпляры одного приложения получают одинаковый размер, код и переменные, а запросы распределяются между ними.
Масштабом управляют два числа
| Поле API | Название в панели | Что задаёт | Пределы | По умолчанию |
|---|---|---|---|---|
max_instances |
Максимум экземпляров | сколько экземпляров приложение может держать одновременно | от 1 до 10 | 1 |
concurrency |
Запросов на экземпляр | порог одновременных запросов на экземпляр, после которого нужен ещё один | от 1 до 1 000 | 100 |
Числа читаются в паре. Максимум говорит, докуда приложение вырастет, порог - с какого места оно начнёт расти. При максимуме 1 порог ничего не меняет: расти некуда.
Порог 1 подходит приложению, которое обслуживает ровно один запрос за раз. Большой порог подходит приложению, которое держит много запросов одновременно и почти не тратит на них процессор, например ждёт ответов от базы. Если сомневаешься, оставь 100.
Порог мягкий. Платформа не ограничивает приложение этим числом, не ставит запросы в очередь и не отвечает отказом сверху. Порог только решает, когда запускать следующий экземпляр. Если приложение упёрлось в максимум, запросы продолжают идти в уже работающие экземпляры, и ответы могут стать медленнее.
Когда число одновременных запросов растёт, новый экземпляр запускается не мгновенно. Пока он стартует, запросы обслуживают уже работающие. Сколько занял последний запуск экземпляра, показывает карточка приложения в панели.
Минимум задаёт сон
Отдельного поля для минимума нет. Минимум определяет сон, то есть поле sleep_enabled:
| Сон | Минимум | Что это значит |
|---|---|---|
| включён | 0 | без запросов приложение уходит в ноль экземпляров и просыпается от первого запроса |
| выключен | 1 | один экземпляр работает круглосуточно |
Сон включён по умолчанию. Через сколько тишины приложение засыпает, от 60 секунд до часа, и сколько занимает пробуждение, разбирает страница Сон и пробуждение.
Итоговый диапазон складывается из двух настроек: при включённом сне приложение держит от 0 до max_instances экземпляров, при выключенном - от 1 до max_instances.
Настройки действуют со следующей версии
Правка масштаба ничего не деплоит. Она ложится на приложение, а каждая новая версия снимает масштаб в момент заказа вместе с остальными настройками. Работающая версия остаётся такой, какой была.
Чтобы новый максимум заработал, закажи версию или запушь в ветку с автодеплоем. В панели для этого есть галка «Задеплоить после сохранения»: с ней кнопка «Сохранить» заодно заказывает версию. Подробнее о том, что хранит версия, - в разделе Версии и откат.
Как задать масштаб
В панели масштаб лежит на странице приложения, в настройках, в карточке «Сон и масштаб». Там четыре поля: переключатель «Засыпать без запросов», срок сна «Когда засыпать», «Запросов на экземпляр» и «Максимум экземпляров». У воркера остаётся только максимум. Под формой панель показывает, сколько места в лимитах проекта займёт выбранное сочетание размера и максимума, и предупреждает до нажатия «Сохранить», если места не хватает.
Через API поля задаются при создании приложения в POST /api/v1/applications и меняются в PATCH /api/v1/applications/{id}. Правится ровно то, что прислано. Для PATCH токену нужны права «деплоить» и «менять мощность». Все запросы и права описаны в разделе API nodbox.
{
"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 ГБ
Все цифры собраны в разделе Лимиты и квоты.
Место считается по потолку, а не по тому, сколько экземпляров работает сейчас. Приложение размера Eco 512 МБ с процессором 0,5 ядра и максимумом 4 занимает в проекте 2 ядра и 2 ГБ памяти, даже когда спит или работает в одном экземпляре. Размер каждого экземпляра берётся из размера приложения, поэтому проект с крупными размерами упирается в процессор и память раньше, чем в число экземпляров.
Из этого следует три правила:
- Увеличение максимума проверяет квоту. Если процессора или памяти не хватает, ответ -
403с полямиquota,limit,usageиrequested. Приложение остаётся с прежним максимумом. - Снижение максимума место не освобождает до деплоя. Работающая версия сохраняет прежний потолок, пока её не заменит новая.
- Двенадцать экземпляров - общий потолок проекта. Платформа держит место не больше чем под двенадцать экземпляров. Сумма максимумов всех приложений, в том числе спящих и остановленных, может выйти за эту границу: запрос не отклоняется, но лишние экземпляры не поднимутся. Следи, чтобы сумма максимумов не превышала 12.
Что видно в панели
На странице приложения экземпляры нарисованы квадратиками: по одному на каждый, максимум показывает, сколько ещё может добавиться. У спящего приложения экземпляров ноль. Число обновляется само, перезагружать страницу не нужно.
В метриках приложения запросы суммируются по всем экземплярам. Процессор и память показывают самый нагруженный экземпляр, а не сумму и не среднее: карточка отвечает на вопрос, хватает ли приложению купленного размера, и отвечает на него худший экземпляр. Подробности - в разделе Метрики приложения.
Что не масштабируется
- Размер. Масштабирование добавляет экземпляры, но не делает их крупнее. Процессор и память одного экземпляра задаёт размер: Размеры приложения.
- Состояние экземпляра. Каждый экземпляр - отдельная копия приложения со своей памятью и своей файловой системой. Данные в памяти и файлы, записанные на месте, другим экземплярам не видны, а два запроса одного пользователя могут попасть на разные экземпляры. Сессии, кэш и загруженные файлы держи в базе или во внешнем хранилище.
- База данных. База не растёт вместе с приложением: у неё свой размер и свой лимит соединений, а каждый экземпляр открывает соединения сам. Размеры баз описаны в разделе Размеры и цена баз.
- Воркер. У воркера нет адреса и запросов, поэтому у него нет ни порога, ни сна. Подробнее о том, чем воркер отличается от веб-приложения, - в разделе Веб-приложения и воркеры.
Размер называет цену одного экземпляра
Цена в каталоге размеров названа за месяц круглосуточной работы одного экземпляра. Пока приложение спит, оно не тарифицируется. Как в списаниях учитывается число поднятых экземпляров, описывает раздел Тарификация.
Что дальше
- Сон и пробуждение - минимум экземпляров и холодный старт
- Размеры приложения - процессор, память и цена одного экземпляра
- Лимиты и квоты - сколько экземпляров, процессора и памяти даёт проект
- Метрики приложения - запросы, процессор и память по экземплярам
- Веб-приложения и воркеры - чем воркер отличается от веб-приложения
Страница в markdown, так её читает агент: /docs/apps/scaling.md