В чем причины ошибки «Out of shared memory: You might need to increase max_locks_per_transaction»?

Доброго дня.
Сегодня получил такую ошибку в логах. До этого сервер крутился без рестарта где-то месяца три, база не то чтобы очень большая, но в некоторых таблицах сотни тысяч строк. Увеличил этот самый "max_locks_per_transaction", поднял "shared_buffers" и "work_mem", перезапустил postgres, проблема исчезла. Но навсегда ли?
Было:
shared_buffers = 128MB			# min 128kB
work_mem = 4MB				# min 64kB
temp_buffers = 8MB			# min 800kB
max_locks_per_transaction = 64		# min 10

Стало:
shared_buffers = 256MB			# min 128kB
work_mem = 16MB				# min 64kB
temp_buffers = 32MB			# min 800kB
max_locks_per_transaction = 1024		# min 10


Выполнение запроса к pg_locks вменяемой информации не дало (или я просто не умею читать между строк).

Собственно, вопрос следующий: куда копать, возможно, настроить доп. логирование? Я хочу точно понять, почему это появилось, дабы предотвратить дальнейшие рецидивы. Может, у меня кривые запросы, которые продуцируют дедлоки? Или просто увеличение объема бд требует увеличение объема выделенной памяти? Еще что-то?

Заранее спасибо.
  • Вопрос задан
  • 9682 просмотра
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
https://www.postgresql.org/docs/current/runtime-co...
This parameter controls the average number of object locks allocated for each transaction; individual transactions can lock more objects as long as the locks of all transactions fit in the lock table. This is not the number of rows that can be locked; that value is unlimited. The default, 64, has historically proven sufficient, but you might need to raise this value if you have queries that touch many different tables in a single transaction, e.g. query of a parent table with many children.


Не имеет отношения к размерам таблиц. Имеет отношение к размеру внутренней таблицы локов и количеству затронутых объектов (например, таблиц) в транзакции. Строго говоря: максимальное число локов объектов одновременно всеми активными транзакциями.
Не имеет никакого отношения к shared_buffers (не вычитается из него, а прибавляется сверху. shared_buffers - строго буфер страниц, даже без учёта структур данных по управлению этим буфером. Сегмент разделяемой памяти всегда больше shared_buffers) или work_mem или чему-то ещё (кроме как max_connections + max_prepared_transactions). Тем более не имеет никакого отношения к дедлокам.

Дефолтного значения обычно более чем достаточно. Может быть злоупотребляете партицированием.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы