Шрифт:
Интервал:
Закладка:
Сообщения о взаимных блокировках могут не помочь точно указать на "проблемы deadlock", наблюдаемые в ваших приложениях. Взаимные блокировки всегда включают двух владельцев (или две раздельные транзакции), каждый из которых мешает другому. Firebird имеет привычку выдавать клиентам сообщения "взаимные блокировки" при большинстве конфликтов блокировок, хотя истинная взаимная блокировка - как было описано ранее - довольно редкое явление.
* Ошибки, возвращаемые как "конфликт блокировки" при запросах блокировки NO WAIT, не фиксируются в таблице блокировок как взаимные блокировки, потому что ожидает только один владелец.
* Ошибки, возвращаемые как "взаимные блокировки" с последующим сообщением "Update conflicts with concurrent update" (Конфликты обновлений при параллельном обновлении), также не являются настоящими взаимными блокировками. В этом случае произошло всего лишь то, что один владелец изменил (или удалил) строку и "пошел" дальше. Другой параллельный владелец попытался изменить (или удалить) ту же самую запись, ждал освобождения ее первым владельцем, а теперь получил ошибку, потому что последняя подтвержденная версия записи была изменена.
Таблица блокировок данных может быть выведена в более или менее читаемом формате с помощью утилиты Lock Print.
Утилита Lock Print
Программой, которая выбирает статистику таблицы блокировки, является исполняемый модуль fb_lock_print, который можно найти в каталоге /bin каталога инсталляции Firebird. (Для версии 1.0.x ищите iblockpr.exe в Windows или gds_lock_pr в POSIX.) Доступны два синтаксиса: один для статичного отчета, другой для задания интерактивной выборки в указанных интервалах.
Синтаксис для Firebird 1.5 и выше:
fb_lock jprint <переключатели>
Версия 1.0.x, POSIX:
gds_lock_pr <переключатели>
Версия 1.0.x, Windows:
iblockpr <переключател14>
Программа fb lock print имеет множество переключателей, описанных в табл. 40.1. Когда не задано ни одного переключателя, fb lock print выводит итоговую информацию, описывающую заголовок блока и владельцев, связанных с Менеджером блокировок.
Таблица 40.1. Переключатели для отчетов Lock Print
Переключатель
Описание
(нет переключателей)
Выводит итоговую информацию, описывающую заголовок блока и владельцев, связанных с Менеджером блокировок
-a
Выводит содержимое таблицы блокировок, включая заголовок блока, группы блоков, группы владельцев и группы запросов. Группа блока представляет ресурс, который должен быть заблокирован (база данных, транзакция, отношение, страница базы данных и т.д.), и идентифицирует владельца, который имеет или запросил блокирование этого объекта. Группа запроса описывает запрос в процессе блокирования ресурса. Группа запроса может описывать или предоставленную блокировку, или ожидание завершения запроса на блокировку
-с
Указывает, что таблица блокировок должна быть скопирована, а не использована сама. Копирование является быстрым и создает мгновенный статичный снимок таблицы блокировок. Тем не менее он остановит все процессы доступа к базе данных на время своего выполнения
-f
Задает, что анализ должен быть выполнен на указанном файле, а не на настоящем файле блокировки. К сожалению, этот переключатель не работает в Firebird
-h
Выводит только историю
-i <переключатели> <t> <n>
Запускает интерактивный режим (см. разд. "Интерактивные отчеты"). Если указано только -i, то выводятся все данные
-l
Выводит только группы блоков
-n
Указывает, что не существует "никакого моста". Мост является переходным механизмом, распознающим множество серверов различных версий Firebird на одной машине. Это не доступно в версиях Firebird 1.0.x или 1.5, но, скорее всего, будет реализовано в следующих версиях Firebird
-o
Выводит группы владельцев
-p
То же, что и -о. (Группы владельцев, используемых в вызовах групп процессов.)
-r
Выводит группы запросов
-s <n>
Выводит заголовок таблицы блокировок, группы владельцев и блокировки указанных серий. Аргумент <n> указывает тип блокируемого ресурса, который вы хотите отобразить. Номера см. в табл. 40.5
-t
Выводит статистику для всех серий (только интерактивный отчет)
-w
Выводит "граф ожидания" - блоки владельцев с запросами ожидания, чего они ожидают, чего ожидают их владельцы и т.д. В этом отчете вы можете просмотреть, какой запрос владельца блокирует другие запросы в таблице блокировок. Это самый простой способ найти блокировки, хотя полное отображение блокировок даст вам много больше информации относительно взаимосвязей, находящихся в очереди запросов
Статичные отчеты
Статичные отчеты выводят текущее состояние (мгновенный снимок) таблицы блокировок. Допустимы любые переключатели, за исключением -i, вы можете "затолкать" в него множество переключателей. Например, для вывода "ожидающего" графа плюс группы истории введите:
fb_lock_print -wh
Интерактивные отчеты
Вторая форма собирает заданные номера выборок фиксированных интервалов и создает интерактивный отчет, отслеживающий текущую деятельность таблицы блокировок. Синтаксис:
fb_lock_print [-i{a,o,w}] [t n]
t задает время в секундах между выборками, n задает количество требуемых выборок. Если вы не задаете значений для n и r, то значением по умолчанию является n= 1.
Выборки осуществляются n раз через интервалы в t секунд. Одна группа выводится для каждой выборки. Средние значения выборки выводятся в конце каждого столбца.
Следующий оператор выводит статистику (доступ к таблице блокировок) в виде 10 выборок, осуществляемых каждые 3 секунды:
fb_lock_print -ia 3 10
В конце этой главы представлен мгновенный снимок интерактивного отчета с объяснением значения каждого столбца.
! ! !
СОВЕТ. Ограничения буфера в окне командной строки могут привести к "исчезновению" выходных данных за исключением последней части. Вы можете направить вывод утилите more (или less в POSIX).
fb_lock_print -wh | more
Когда окно будет заполнено, нажмите или держите нажатой клавишу <Return> (Enter) для отображения дальнейшего вывода по строке за раз. Нажатие клавиш <Ctrl>+<C> завершает more или less.
. ! .
Вывод отчета в файл
Обычно результаты являются достаточно большими, чтобы их просматривать с консоли. Вы можете направить их в выходной файл, например, в каталог с именем /data/server_reports/ (ваш выбор!) таким образом:
fb_lock_print -а > /data/server_reports/lock.txt
Если вы видите, что Lock Print выполняется более минуты или двух или замечаете, что он заполняет ваш диск, остановите его с помощью <Ctrl>+<C> или эквивалента вашей платформы.
Группы отображаются в порядке внутренних списков. Новые группы помещаются в начало списка, следовательно, обновленная таблица блокировок будет показана в строках в обратном порядке. Поскольку группы блоков, запросов и владельцев освобождаются и используются заново, порядок становится полным беспорядком. Текстовый редактор будет весьма полезным для исследования отношений.
Простое использование Lock Print
Мы посмотрим на пример очень простой статистики, полученной от Lock Print без переключателей.
* Заголовок блока всегда будет первым.
* Далее идут группы владельцев - за группой владельца следуют все запросы этого владельца. Каждый владелец цепочки выводится с его запросами.
* После всех владельцев и запросов идут блокировки.
* Последним элементом является история записей.
Группа Lock_HeaderВначале мы рассмотрим только группу заголовка блока, которая описывает основную конфигурацию и состояние таблицы блокировок. На рис. 40.2 числа добавлены для ссылок на каждый элемент при объяснении в табл. 40.2.
Рис. 40.2. Группа Lock_Header
Наш отчет Lock Print представляет только что созданную базу данных, к которой имеет доступ одна копия isql в версии l.O.x Суперсервера для Windows.
Таблица 40.2. Записи группы Lock_Header
№
Элемент
Объяснение
1
LOCK_HEADER_BLOCK
Первая группа любого отчета Lock Print. Каждый отчет выводит ровно одну группу заголовка блока
2
Version (Версия)
Номер версии Менеджера блокировок. В Firebird 1.5 версия будет 115 для Суперсервера и 5 для Классического сервера. В Firebird 1.0.x (для нашего примера) такими версиями будут 114 и 4 соответственно
3
Active owner (Активный владелец)
Смещение в группе владельца, представляющее владельца, который в настоящий момент управляет таблицей блокировок, если такой существует. Если ни один процесс не пишет в таблицу блокировок, то активным владельцем будет 0
- C++ - Страустрап Бьярн - Программирование
- Энциклопедия разработчика модулей ядра Linux - Ори Померанц - Программирование
- Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп - Программирование