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.12 Краткое описание переменных системы 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.