Траблшутинг ошибки PostgreSQL out of shared memory: расчет max_locks_per_transaction
- Выполнение сложных запросов, миграций или дампов прерывается ошибкой
ERROR: out of shared memory. - В логах PostgreSQL присутствует подсказка:
HINT: You might need to increase max_locks_per_transaction. - Сбои в базах данных с тысячами партиционированных таблиц (Declarative Partitioning) при параллельных транзакциях.
1. Архитектура таблицы блокировок в Shared Memory PostgreSQL
Размер общей таблицы блокировок в разделяемой памяти рассчитывается при старте сервера по формуле:
Total_Lock_Slots = (max_connections + max_prepared_transactions) * max_locks_per_transactionЕсли суммарное число объектов, заблокированных открытыми транзакциями, превышает этот пул, PostgreSQL аварийно прерывает запрос.
2. Расчет и изменение параметров в postgresql.conf
Отредактируйте файл postgresql.conf:
# Увеличьте лимит блокировок на транзакцию (по умолчанию: 64)
max_locks_per_transaction = 256
# Если используется партиционирование с сотнями секций:
# max_locks_per_transaction = 512
# Убедитесь, что max_pred_locks_per_transaction также увеличен при изоляции Serializable
max_pred_locks_per_transaction = 2563. Перезапуск службы PostgreSQL
Так как размер пула блокировок выделяется в Shared Memory при инициализации, изменение требует полного перезапуска СУБД:
# Debian / Ubuntu
systemctl restart postgresql
# RHEL / Rocky Linux
systemctl restart postgresql-154. Проверка примененных настроек
SHOW max_locks_per_transaction; Частые вопросы (FAQ)
Почему партиционирование таблиц вызывает ошибку out of shared memory?
При обращении к родительской таблице планировщик PostgreSQL блокирует саму родительскую таблицу и каждую ее отдельную секцию. Запрос к таблице со 100 партициями мгновенно захватывает более 100 слотов блокировок.
Приведет ли увеличение max_locks_per_transaction к высокому расходу RAM?
Нет, каждый слот блокировки занимает несколько сотен байт. Увеличение параметра с 64 до 512 потребует всего несколько десятков мегабайт дополнительной памяти в Shared Memory.