7.9.3 Инструмент LOCK_ORDER
Сервер MySQL — многопоточная программа, которая использует множество внутренних блокировок и связанных с ними примитивов, таких как мьютексы, rwlocks (включая prlocks и sxlocks), условия и файлы. Внутри сервера набор объектов, связанных с блокировками, изменяется с реализацией новых функций и рефакторингом кода для повышения производительности. Как и в любой многопоточной программе, использующей примитивы блокировки, всегда существует риск возникновения тупиковой ситуации во время выполнения, когда несколько блокировок удерживаются одновременно. Для MySQL последствия тупиковой ситуации катастрофические, приводя к полному отказу в обслуживании.
Для того, чтобы обеспечить обнаружение тупиков при приобретении блокировок и гарантировать отсутствие тупиков во время выполнения, MySQL поддерживает инструмент LOCK_ORDER. Это позволяет определить зависимость графа порядка блокировок как часть проектирования сервера, а также обеспечить проверку во время работы сервера, чтобы гарантировать, что приобретение блокировок является ациклическим, и что пути выполнения соответствуют графу.
Этот раздел предоставляет информацию об использовании инструмента LOCK_ORDER, но только на базовом уровне. Для получения полной информации см. раздел «Порядок блокировок» в документации MySQL Server Doxygen, доступной по адресу https://dev.mysql.com/doc/index-other.html.
Инструмент LOCK_ORDER предназначен для отладки сервера, а не для использования в рабочей среде.
Для использования инструмента LOCK_ORDER следуйте данной процедуре:
-
Скомпилируйте MySQL из исходного кода, настроив его с помощью опции
-DWITH_LOCK_ORDER=ONCMake, чтобы сборка включала инструментLOCK_ORDER.ПримечаниеПри включенной опции
WITH_LOCK_ORDER, сборка MySQL требует программу flex. Чтобы запустить сервер с включённым инструментом
LOCK_ORDER, включите системную переменнуюlock_orderпри запуске сервера. Доступны и другие системные переменные для настройкиLOCK_ORDER.Для работы набора тестов MySQL, у mysql-test-run.pl есть опция
--lock-order, которая управляет включением инструментаLOCK_ORDERво время выполнения тестовых случаев.
Системные переменные, описанные ниже, конфигурируют работу инструмента LOCK_ORDER, при условии, что MySQL был скомпилирован с включением инструмента LOCK_ORDER. Основной переменной является lock_order, которая указывает, следует ли включать инструмент LOCK_ORDER во время выполнения:
Если
lock_orderотключена (по умолчанию), никакие другие системные переменныеLOCK_ORDERне имеют никакого эффекта.Если
lock_orderвключена, другие системные переменные конфигурируют, какие функцииLOCK_ORDERвключить.
В общем случае, предполагается, что инструмент LOCK_ORDER настраивается путём запуска mysql-test-run.pl с опцией --lock-order, и для mysql-test-run.pl для установки системных переменных LOCK_ORDER с соответствующими значениями.
Все системные переменные LOCK_ORDER должны быть установлены при запуске сервера. Во время выполнения их значения видимы, но изменить их нельзя.
Некоторые системные переменные существуют парами, например lock_order_debug_loop и lock_order_trace_loop. Для таких пар переменные различаются следующим образом, когда возникает условие, с которым они связаны:
Если переменная
_debug_включена, вызывается ошибка отладки.Если переменная
_trace_включена, сообщение об ошибке записывается в журналы.
Таблица 7.8 Краткое описание системной переменной LOCK_ORDER
| Имя переменной | Тип переменной | Область действия |
|---|---|---|
| lock_order | Булево | Глобальная |
| lock_order_debug_loop | Булево | Глобальная |
| lock_order_debug_missing_arc | Булево | Глобальная |
| lock_order_debug_missing_key | Булево | Глобальная |
| lock_order_debug_missing_unlock | Булево | Глобальная |
| lock_order_dependencies | Имя файла | Глобальная |
| lock_order_extra_dependencies | Имя файла | Глобальная |
| lock_order_output_directory | Имя каталога | Глобальная |
| lock_order_print_txt | Булево | Глобальная |
| lock_order_trace_loop | Булево | Глобальная |
| lock_order_trace_missing_arc | Булево | Глобальная |
| lock_order_trace_missing_key | Булево | Глобальная |
| lock_order_trace_missing_unlock | Булево | Глобальная |
END_OF_DOCUMENT_MARKER
-
Формат командной строки --lock-order[={OFF|ON}]Системная переменная lock_orderОбласть видимости Глобальная Динамическая Нет SET_VARПодсказка применяетсяНет Тип Булево Значение по умолчанию OFFВключать ли инструмент
LOCK_ORDERво время выполнения. Еслиlock_orderотключен (по умолчанию), никакие другие системные переменныеLOCK_ORDERне оказывают никакого влияния. Еслиlock_orderвключен, другие системные переменные настраивают, какие функцииLOCK_ORDERследует включить.Если
lock_orderвключен, возникает ошибка, если сервер обнаруживает последовательность приобретения блокировок, которая не объявлена в графе порядка блокировок. -
Формат командной строки --lock-order-debug-loop[={OFF|ON}]Системная переменная lock_order_debug_loopОбласть видимости Глобальная Динамическая Нет SET_VARПодсказка применяетсяНет Тип Булево Значение по умолчанию OFFВызывает ли инструмент
LOCK_ORDERсбой утверждения отладки, когда он сталкивается с зависимостью, помеченной как цикл в графе порядка блокировок. -
Формат командной строки --lock-order-debug-missing-arc[={OFF|ON}]Системная переменная lock_order_debug_missing_arcОбласть видимости Глобальная Динамическая Нет SET_VARПодсказка применяетсяНет Тип Булево Значение по умолчанию OFFВызывает ли инструмент LOCK_ORDER сбой утверждения отладки, когда он сталкивается с зависимостью, которая не объявлена в графе порядка блокировок.
-
Формат командной строки --lock-order-debug-missing-key[={OFF|ON}]Системная переменная lock_order_debug_missing_keyОбласть видимости Глобальная Динамическая Нет SET_VARПодсказка применяетсяНет Тип Булево Значение по умолчанию OFFВызывает ли инструмент
LOCK_ORDERсбой утверждения отладки, когда он сталкивается с объектом, который ненадлежащим образом инструментирован с помощью Performance Schema. -
lock_order_debug_missing_unlockФормат командной строки --lock-order-debug-missing-unlock[={OFF|ON}]Системная переменная lock_order_debug_missing_unlockОбласть видимости Глобальная Динамическая Нет SET_VARПодсказка применяетсяНет Тип Булево Значение по умолчанию OFFВызывает ли инструмент
LOCK_ORDERсбой утверждения отладки, когда он сталкивается с блокировкой, которая уничтожается, пока еще удерживается. -
Формат командной строки --lock-order-dependencies=file_nameСистемная переменная lock_order_dependenciesОбласть видимости Глобальная Динамическая Нет SET_VARПодсказка применяетсяНет Тип Имя файла Значение по умолчанию empty stringПуть к файлу
lock_order_dependencies.txt, который определяет граф зависимостей порядка блокировок сервера.Разрешено не указывать зависимости. В этом случае используется пустой граф зависимостей.
-
Формат командной строки --lock-order-extra-dependencies=file_nameСистемная переменная lock_order_extra_dependenciesОбласть видимости Глобальная Динамическая Нет SET_VARПодсказка применяетсяНет Тип Имя файла Значение по умолчанию empty stringПуть к файлу, содержащему дополнительные зависимости для графа зависимостей порядка блокировок. Это полезно для изменения основного графа зависимостей сервера, определенного в файле
lock_order_dependencies.txt, с помощью дополнительных зависимостей, описывающих поведение стороннего кода. (Альтернативой является изменение самогоlock_order_dependencies.txt, что не рекомендуется.)Если эта переменная не установлена, дополнительный файл не используется.
-
Формат командной строки --lock-order-output-directory=dir_nameСистемная переменная lock_order_output_directoryОбласть видимости Глобальная Динамическая Нет SET_VARПодсказка применяетсяНет Тип Имя каталога Значение по умолчанию empty stringКаталог, в который инструмент
LOCK_ORDERзаписывает свои журналы. Если эта переменная не установлена, по умолчанию используется текущий каталог. -
Формат командной строки --lock-order-print-txt[={OFF|ON}]Системная переменная lock_order_print_txtОбласть видимости Глобальная Динамическая Нет SET_VARПодсказка применяетсяНет Тип Булево Значение по умолчанию OFFВыполняет ли инструмент
LOCK_ORDERанализ графа порядка блокировок и печатает текстовый отчет. Отчет включает в себя любые обнаруженные циклы приобретения блокировок. -
Формат командной строки --lock-order-trace-loop[={OFF|ON}]Системная переменная lock_order_trace_loopОбласть видимости Глобальная Динамическая Нет SET_VARПодсказка применяетсяНет Тип Булево Значение по умолчанию OFFПечатает ли инструмент
LOCK_ORDERтрассировку в файле журнала, когда он сталкивается с зависимостью, помеченной как цикл в графе порядка блокировок.
-
Формат командной строки --lock-order-trace-missing-arc[={OFF|ON}]Системная переменная lock_order_trace_missing_arcОбласть действия Глобальная Динамическая Нет SET_VARПрименяется подсказкаНет Тип Булево Значение по умолчанию ONБудет ли инструмент
LOCK_ORDERвыводить трассировку в файл журнала, когда он обнаружит зависимость, не объявленную в графе порядка блокировок. -
Формат командной строки --lock-order-trace-missing-key[={OFF|ON}]Системная переменная lock_order_trace_missing_keyОбласть действия Глобальная Динамическая Нет SET_VARПрименяется подсказкаНет Тип Булево Значение по умолчанию OFFБудет ли инструмент
LOCK_ORDERвыводить трассировку в файл журнала, когда он обнаружит объект, не должным образом снабженный инструментированием Performance Schema. -
lock_order_trace_missing_unlockФормат командной строки --lock-order-trace-missing-unlock[={OFF|ON}]Системная переменная lock_order_trace_missing_unlockОбласть действия Глобальная Динамическая Нет SET_VARПрименяется подсказкаНет Тип Булево Значение по умолчанию ONБудет ли инструмент
LOCK_ORDERвыводить трассировку в файл журнала, когда он обнаружит блокировку, уничтоженную при её удержании.
© 2025 Oracle
Licensed under the GPLv2 License.