Управление блокировками

Документ описывает параметры категории Управление блокировками в конфигурации системы.

YMatrix реализует следующие два механизма обнаружения взаимоблокировок:

  • Механизм обнаружения локальных взаимоблокировок:

    • Локальная взаимоблокировка: Возникает, когда два или более транзакции удерживают блокировки, которые другие пытаются получить. Например, если Транзакция 1 удерживает эксклюзивную блокировку на таблице A и пытается получить эксклюзивную блокировку на таблице B, в то время как Транзакция 2 уже удерживает эксклюзивную блокировку на таблице B и запрашивает её на таблице A, ни одна из транзакций не может продолжиться.
    • Локальные взаимоблокировки возникают в пределах одного экземпляра MXSegment, когда различные транзакции ожидают друг друга. Процесс Postgres включает надежный механизм для автоматического обнаружения таких взаимоблокировок и их разрешения путем прерывания одной из задействованных транзакций, позволяя другим продолжить выполнение.
  • Механизм обнаружения глобальных взаимоблокировок:

    • Глобальная взаимоблокировка: Возникает, когда внутри отдельных экземпляров MXSegment нет локальных взаимоблокировок, но существует цикл ожидания между несколькими сегментами, препятствующий прогрессу глобальных транзакций.
    • Механизм обнаружения глобальных взаимоблокировок предназначен для распределенных кластеров баз данных. Он требует, чтобы MXMaster запускал процесс Global Deadlock Detector (GDD), который периодически собирает отношения ожидания блокировок со всех MXSegment (и MXMaster). GDD анализирует эти отношения для обнаружения глобальных взаимоблокировок. При обнаружении взаимоблокировки она разрешается с использованием предопределенных политик (например, завершением самой молодой транзакции).

Примечание!
Для обеспечения стабильности и безопасности системы ручное изменение этих параметров должно выполняться с крайней осторожностью.

deadlock_timeout


Время (в миллисекундах), в течение которого ожидается блокировка перед проверкой на взаимоблокировку.

  • Обнаружение взаимоблокировок требует значительных ресурсов. Поэтому сервер не выполняет проверки на взаимоблокировку при каждом ожидании блокировки.
  • Предполагая, что взаимоблокировки редки в рабочих нагрузках производства, короткий интервал ожидания перед запуском обнаружения взаимоблокировок является достаточным. Увеличение этого значения снижает количество ненужных проверок, но также задерживает сообщение об истинных ошибках взаимоблокировки.
  • Если единица измерения не указана, значение интерпретируется в миллисекундах. Значение по умолчанию — 1000, которое может быть наименьшим практически применимым значением. На сильно загруженных серверах может потребоваться увеличить его. Оптимальное значение должно превышать типичную продолжительность транзакции, чтобы снизить вероятность запуска проверки взаимоблокировки до освобождения блокировок.
  • При включении log_lock_waits этот параметр также определяет время ожидания перед записью событий ожидания блокировок в лог. Для анализа задержек блокировок может потребоваться установить значение меньше значения по умолчанию deadlock_timeout.
Тип данных Значение по умолчанию Диапазон Область применения
int 1000 1 ~ INT_MAX segment; system; restart; superuser

gp_enable_global_deadlock_detector


Включает или отключает глобальный детектор взаимоблокировок YMatrix для управления параллельными операциями UPDATE и DELETE над таблицами HEAP для повышения производительности.

  • Значение по умолчанию — off; глобальный детектор взаимоблокировок отключен.
  • Если глобальный детектор взаимоблокировок отключен (по умолчанию), YMatrix последовательно выполняет параллельные операции обновления и удаления над таблицами HEAP.
  • Если включен, разрешаются параллельные обновления. Глобальный детектор взаимоблокировок обнаруживает взаимоблокировки и разрешает их путем завершения одного или нескольких бэкенд-процессов, связанных с самой молодой транзакцией.
  • Таблицы с первичным ключом или уникальным индексом также могут вызывать обнаружение глобальных взаимоблокировок при INSERT.
  • Административные команды, такие как CREATE, ALTER и DROP, также могут вызывать взаимоблокировки.
Тип данных Значение по умолчанию Область применения
boolean off master; system; restart

gp_global_deadlock_detector_period


Задает интервал обнаружения (в секундах) для фонового процесса Global Deadlock Detector (GDD).

Тип данных Значение по умолчанию Диапазон Область применения
int 120 5 ~ INT_MAX master; system; reload

max_locks_per_transaction


Общая таблица блокировок отслеживает блокировки до max_locks_per_transaction * (max_connections + max_prepared_transactions) различных объектов.

  • В любой момент времени не может быть заблокировано более этого числа различных объектов.
  • Этот параметр управляет средним количеством блокировок объектов, выделяемых на транзакцию. Отдельные транзакции могут блокировать больше объектов, вплоть до общей емкости таблицы блокировок для всех транзакций.
  • Этот параметр не ограничивает количество строк, которые могут быть заблокированы, поэтому значение не является неограниченным.
  • Если ваша рабочая нагрузка включает запросы, обращающиеся к множеству различных таблиц в рамках одной транзакции (например, запрос к родительской таблице с множеством дочерних партиций), вам может потребоваться увеличить это значение.
  • Этот параметр можно задать только при запуске сервера.
  • При запуске резервного сервера этот параметр должен быть установлен на значение, большее или равное значению на основном сервере; в противном случае запросы на резервном сервере будут запрещены.
Тип данных Значение по умолчанию Диапазон Область применения
int 128 10 ~ INT_MAX segments; system; restart

max_pred_locks_per_page


Управляет количеством строк, которые может охватывать предикатная блокировка на одной странице, прежде чем она будет расширена для охвата всей страницы.

Тип данных Значение по умолчанию Диапазон Область применения
int 2 0 ~ INT_MAX segments; system; reload

max_pred_locks_per_relation


Управляет количеством страниц или кортежей, которые может охватывать предикатная блокировка в одном отношении, прежде чем она будет расширена для охвата всего отношения.

  • Значение, большее или равное 0, представляет абсолютный лимит. Отрицательное значение означает, что лимит рассчитывается как max_pred_locks_per_transaction, деленное на абсолютное значение этого параметра.
Тип данных Значение по умолчанию Диапазон Область применения
int -2 INT_MIN ~ INT_MAX segments; system; reload

max_pred_locks_per_transaction


Общая таблица предикатных блокировок отслеживает блокировки до max_pred_locks_per_transaction * (max_connections + max_prepared_transactions) различных объектов (например, таблиц).

  • В любой момент времени не может быть заблокировано более этого числа различных объектов.
  • Этот параметр управляет средним количеством блокировок объектов, выделяемых на транзакцию. Отдельные транзакции могут блокировать больше объектов, вплоть до общей емкости таблицы блокировок для всех транзакций.
  • Этот параметр не ограничивает количество строк, которые могут быть заблокированы, поэтому значение не является неограниченным.
  • В большинстве случаев значение по умолчанию показало достаточность в тестах. Однако, если ваша рабочая нагрузка включает сериализуемые транзакции, обращающиеся к множеству различных таблиц (например, запрос к родительской таблице с множеством дочерних партиций), вам может потребоваться увеличить это значение.
  • Этот параметр можно задать только при запуске сервера.
Тип данных Значение по умолчанию Диапазон Область применения
int 64 10 ~ INT_MAX segments; system; restart