Планирование ресурсов
Это руководство помогает рассчитать размер установки Mockarty до запуска: сколько
процессора и памяти нужно каждому компоненту, сколько соединений с PostgreSQL
заложить и какие настройки менять по мере роста. Числа ниже — реальные значения
продукта по умолчанию, а не оценки.
Как компоненты связаны между собой, описано в разделе Архитектура масштабирования.
Начальные размеры
| Компонент | Минимум | Рекомендуется для продакшена | Примечания |
|---|---|---|---|
| Узел администрирования | 2 vCPU / 2 ГБ | 4 vCPU / 4 ГБ | Веб-интерфейс, API, планировщики и обслуживание моков. Первой заканчивается память, а не процессор. |
| PostgreSQL | 1 ГБ ОЗУ | 2 ГБ ОЗУ, SSD-диск | Диск рассчитывайте от срока хранения данных, а не от числа пользователей. |
| Redis | 512 МБ | 1 ГБ | Необязателен для одного узла, обязателен для нескольких узлов администрирования. |
| Резолвер моков | 1 vCPU / 512 МБ | 1 vCPU / 1 ГБ | Добавляйте резолверы, чтобы обслуживать больше трафика моков. |
| Раннер | зависит от задач | — | Больше всего ресурсов требуют нагрузочные и браузерные тесты; рассчитывайте каждый раннер под свои тесты. |
Десктопной или ознакомительной установке нужен только узел администрирования:
он может хранить данные в локальном файле SQLite, а кэш — в памяти.
Значения Helm-чарта по умолчанию
Helm-чарт задаёт запросы и лимиты, с которыми каждый под запускается на небольшом
кластере. Считайте их нижней границей: для продакшена задайте узлу
администрирования процессор и память не ниже рекомендованных выше.
| Компонент (ключ values) | Запросы (CPU / память) | Лимиты (CPU / память) |
|---|---|---|
Узел администрирования (admin) |
200m / 256Mi | 1000m / 2Gi |
Резолвер моков (resolver) |
100m / 128Mi | 500m / 512Mi |
Раннер (runner) |
100m / 128Mi | 500m / 512Mi |
PostgreSQL (postgresql.primary) |
100m / 256Mi | 500m / 512Mi |
Redis (redis.master) |
50m / 64Mi | 200m / 256Mi |
Измените их в своём файле values, например:
admin:
resources:
requests: { cpu: "1", memory: 2Gi }
limits: { cpu: "4", memory: 4Gi }
Соединения с PostgreSQL
Нехватка соединений с базой — самая частая проблема ёмкости в установке из
нескольких узлов: запросы начинают падать, хотя процессора и памяти достаточно.
Рассчитайте число соединений до масштабирования.
Каждый узел администрирования держит два пула соединений и несколько отдельных
соединений для обновлений в реальном времени:
| Настройка | По умолчанию | Что определяет |
|---|---|---|
DB_MAX_OPEN_CONNS |
25 | Основной пул: сопоставление моков, чтение и сохранение данных |
BOOTSTRAP_DB_MAX_OPEN_CONNS |
4 на CPU, от 16 до 30 | Служебный пул: лицензии, планировщики, уведомления, раннеры |
| Соединения для обновлений в реальном времени | до 10 | События кластера и живое обновление экранов; не настраиваются |
| Пул резолвера моков | 3 | Соединения только для чтения у каждого резолвера |
«CPU» — это лимит процессора контейнера узла администрирования (или число
процессоров машины, если лимита нет). Поэтому один узел использует не больше:
на узел администрирования = DB_MAX_OPEN_CONNS + BOOTSTRAP_DB_MAX_OPEN_CONNS + 10
Посчитайте все поды, которые могут существовать одновременно, — максимум
автомасштабирования плюс дополнительный под, который запускает плавное
обновление, — и держите итог не выше 80 % от max_connections PostgreSQL.
Остальное нужно для резервного копирования, миграций и ваших собственных сессий:
итого = (поды администрирования + запас) × на узел + (поды резолверов + запас) × 3
Как складываются профили самого чарта:
| Профиль | Поды администрирования | Поды резолверов | Худший случай | max_connections |
|---|---|---|---|---|
По умолчанию (values.yaml) |
2 × (25 + 16 + 10) | 0 | 102 | 200 |
Кластер (values.cluster.yaml) |
5 × (15 + 16 + 10) | 11 × 3 | 238 | 300 |
Именно поэтому чарт поднимает max_connections у встроенного PostgreSQL:
собственного значения PostgreSQL по умолчанию, 100, не хватает даже одному узлу
администрирования во время плавного обновления. С внешним PostgreSQL примените
формулу к своей схеме и либо поднимите max_connections, либо уменьшите пулы:
admin:
env:
DB_MAX_OPEN_CONNS: "15"
BOOTSTRAP_DB_MAX_OPEN_CONNS: "16"
postgresql:
primary:
extendedConfiguration: |
max_connections = 300
Каждое соединение стоит PostgreSQL памяти, поэтому поднимайте память PostgreSQL
вместе с max_connections. При большом числе резолверов пул соединений перед
PostgreSQL держит их количество низким.
SQLite (десктоп и единый бинарник)
Узел, хранящий данные в SQLite, открывает основной пул по 2 соединения на CPU
(от 4 до 32, переопределяется SQLITE_MAX_OPEN_CONNS) и служебный пул по 1 на
CPU (от 4 до 8). Чтение идёт параллельно, запись — по очереди. SQLite подходит
одному человеку или небольшой команде на одной машине — переходите на PostgreSQL
до того, как запись начнут вести несколько человек одновременно.
Redis
Каждый узел администрирования открывает до 10 соединений с Redis на CPU, но не
меньше 20 (переопределяется CACHE_REDIS_POOL_SIZE), и держит не меньше 4 из них
готовыми (CACHE_REDIS_MIN_IDLE_CONNS). Если Redis ограничивает число клиентов,
держите поды администрирования × размер пула ниже его maxclients.
Кэш в памяти
Без Redis каждый узел администрирования кэширует в собственной памяти, по
умолчанию до 200 МБ (REPO_INMEMORY_MAX_SIZE_MB). Учитывайте его в лимите
памяти узла.
Диск
Диск базы растёт вместе с хранимой историей — журналами запросов, результатами
тестовых прогонов и журналом аудита, — а не с числом моков или пользователей.
Настройте политики очистки в панели администрирования под нужный срок хранения,
затем планируйте диск как суточный объём × дни хранения плюс около 30 % запаса.
Большие файлы отчётов и вложения попадают в файловое или объектное хранилище,
его размер рассчитывайте отдельно. В разделе Архитектура масштабирования
есть примеры для небольших, средних и крупных команд.
Когда масштабироваться
| Что вы видите | Что делать |
|---|---|
| Ответы моков замедляются под нагрузкой | Добавьте резолверы моков |
| Память узла администрирования подходит к лимиту | Поднимите лимит памяти или добавьте узлы администрирования за балансировщиком |
| Ошибки со словами «too many clients» или тайм-ауты соединений | Пересчитайте бюджет соединений PostgreSQL выше |
| Тестовые прогоны ждут в очереди | Добавьте раннеры с возможностями, которые нужны этим тестам |
| Диск базы растёт без остановки | Сократите срок хранения в политиках очистки |