#1851: Настройки Swarmica для лучшей производительности

Отредактирована: 7 дней назад

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

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

Далее будут представлены исключительно рекомендации. На практике может потребоваться тонкая настройка отдельных параметров для оптимальной производительности 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 файле:

...
 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:

docker compose down && docker compose up -d

Django

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

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:

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

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

docker compose down && docker compose up -d

Celeryworker

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

max-tasks-per-child=1000

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

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

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

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

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

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

docker compose down && docker compose up -d