Поддержка PGBouncer

Remnawave разворачивается в режиме INSTANCE_TYPE=api (несколько форков через PM2 по числу ядер, регулируется API_INSTANCES), плюс отдельные процессы INSTANCE_TYPE=processor (BullMQ-воркеры users, nodes, очереди serial-operations) и INSTANCE_TYPE=scheduler (review-nodes task, expiry-watch и т.д.).

У каждого процесса свой Prisma-пул, дефолт у Prisma: num_physical_cpus * 2 + 1, что на 8-ядерной машине = 17 коннектов на один процесс. Уже 4 процесса дают 60+ коннектов в idle, под нагрузкой больше.

Postgres дефолт max_connections=100 пробивается на ровном месте, а каждый коннект стоит ~10MB RSS у backend-процесса Postgres, то есть 100 коннектов = 1GB только под бэкенды.

PgBouncer впереди Postgres в pool_mode=transaction с default_pool_size 20–30 сжимает 100+ клиентских коннектов до 25 серверных при сохранении пиковой пропускной способности.

В версии 2.8.0 (а сейчас – в dev) была добавлена поддержка DIRECT_URL.

Использование:

DATABASE_URL – тут указывается строка подключения с пулером (?pgbouncer=true).

DIRECT_URL - для того, чтобы миграции применились – тут нужно будет указать прямое подключение.