# Настройки Swarmica для лучшей производительности
В данной статье представлены рекомендации настроек установки Swarmica (\~1000 пользователей всего и \~100-150 единовременно онлайн) на сервере с 16 CPU и 32Gb RAM.

Основная нагрузка в Swarmica ложится на сервисы: Postgres, Django и Celeryworker.

:::caution
Далее будут представлены исключительно рекомендации. На практике может потребоваться тонкая настройка отдельных параметров для оптимальной производительности Swarmica.
:::

## Postgres

Рекомендуемые настройки:

```
max_connections=500
shared_buffers=8GB
effective_cache_size=24GB
work_mem=16MB
maintenance_work_mem=512MB
random_page_cost=1.1
effective_io_concurrency=200
temp_buffers=32MB
track_activity_query_size=16384
wal_keep_size=512MB
```

**Прямо влияют на производительность:**

`max_connections` - Максимальное количество одновременных клиентских подключений к серверу.
`shared_buffers` - Основной буфер PostgreSQL для работы с таблицами и индексами. Рекомендуется устанавливать 20–25% от RAM сервера.
`effective_cache_size` - сколько суммарно кэша может быть доступно для данных — включая shared\_buffers и кэш операционной системы. Рекомендуется устанавливать 70-75% от RAM сервера.
`work_mem` - Объём памяти для одной операции сортировки или хеш-таблицы внутри запроса.
`maintenance_work_mem` - Память для обслуживающих операций: VACUUM, CREATE INDEX, REINDEX, ALTER TABLE и т.п.
Большое значение ускоряет создание индексов и очистку.
`random_page_cost` - Оценка стоимости случайного чтения страницы относительно последовательного. Значение 1.1 обычно ставят на быстрых SSD/NVMe, чтобы планировщик не избегал index scans слишком агрессивно.

**Опциональные:**

`effective_io_concurrency` - Сколько одновременных дисковых I/O операций PostgreSQL может выполнять параллельно.
`track_activity_query_size` - Максимальная длина текста запроса, который сохраняется в pg\_stat\_activity.
`temp_buffers` - Локальные буферы для временных таблиц в рамках одной сессии. Память выделяется по мере необходимости, не сразу на всех.
`wal_keep_size` - Минимальный объём старых WAL-файлов, которые PostgreSQL будет держать в каталоге pg\_wal. Полезно для репликации.

### как применить

Чтобы применить данные настройки необходимо изменить команду старта сервиса postgres в docker-compose.yml файле:

```yaml
...
 postgres:
    image: postgres:14.2-bullseye
    container_name: swarmica-postgres
    command: postgres -N 500 -c shared_buffers=8GB -c effective_cache_size=24GB -c work_mem=16MB -с maintenance_work_mem=512MB -с random_page_cost=1.1 -с effective_io_concurrency=200 -c temp_buffers=32MB -с track_activity_query_size=16384 -с wal_keep_size=512MB
    restart: always
...
```

и произвести рестарт Swarmica:

```bash
docker compose down && docker compose up -d
```

## Django

Рекомендуемые настройки:

```txt
threads=4 
workers=16
max-requests=2000 
max-requests-jitter=100 
graceful-timeout=60
```

**Прямо влияют на производительность:**

`threads` - количество потоков на 1 worker'а. Рекомендуется 2-8 на 1 worker'а.
`workers` - количество worker'ов. Рекомендуется устанавливать 1 worker на 1 CPU unit.

Крайне не рекомендуется выставлять слишком высокие значения workers и threads, т.к. это может привести в обратному эффекту - снижению производительности.

**Для эффективного использования памяти:**

`max-requests` - максимальное кол-во запросов для одного воркера, после которых он рестартует
`max-requests-jitter` - погрешность для max-requests, чтобы все воркеры не рестартовали одновременно
`graceful-timeout` - (опционально) время, которое дается на завершение обработки запроса перед рестартом. По дефолту 30 сек

Эти параметры нужны для того, чтобы избежать утечки памяти. При рестарте worker'а высвобождается вся память, занятая им.

### как применить:

Чтобы применить данные настройки необходимо изменить в файле .env строку GUNICORN\_CMD\_ARGS:

```txt
GUNICORN_CMD_ARGS="--threads=4 --workers=16 --max-requests=2000 --max-requests-jitter=100 --graceful-timeout=60"
```

и произвести рестарт Swarmica:

```bash
docker compose down && docker compose up -d
```

## Celeryworker

Рекомендуемые настройки:

```txt
max-tasks-per-child=1000
```

**Для эффективного использования памяти:**

max-tasks-per-child - количество задач, после обработки которых процесс перезапускается. Необходимо для того, чтобы избежать утечки памяти.

### как применить

Чтобы применить данные настройки необходимо изменить в файле .env строку CELERY\_CMD\_ARGS:

```txt
CELERY_CMD_ARGS="--max-tasks-per-child=1000"
```

и произвести рестарт Swarmica:

```bash
docker compose down && docker compose up -d
```