среда, 28 марта 2012 г.

Lib.ldb


Наверное, для начала, что-то общее для всех. Описываемые далее действия производились в разное время и в конце привели к некоторому пониманию назначения файла *.ldb, который всё время болтается возле больших и серьёзных файлов (не забудь вместо * подставить имя открытой базы, например Lib.ldb). Сам появляется, сам исчезает...
Кстати, все средства выгрузки записей в МАРК формате, модулей АС-Библиотека-3, по умолчанию так-же предлагают расширение *.ldb (очевидно от local db). Но это другая тема.
Из руководств по "Access" известно, что это файл блокировок. Ну и что это даёт? Зачем он нужен? Можно ли его грохнуть? И когда?
Попробуем препарировать его с помощью "Процесс монитор" (Найдёш его и ещё много интересного по ссылке http://technet.microsoft.com/ru-ru/sysinternals/bb896645)
Сразу замечу, если задумаеш повторить, не забудь поставить фильтрацию событий только процесса "EServer". Иначе ты утонеш в потоке. Кроме того, по умолчанию, он сохраняет события в виртуальной памяти, а значит в файл подкачки. И если он невелик - ты быстро исчерпаеш ресурсы. Направь поток в какой нибудь файл, если намерен сделать "большой захват". В нашем случае можно оставить по умолчанию.
Итак, открываем "Диспетчер задач", находим для "EServer.exe" PID = 3924.


Запускаем "Процесс монитор" и сразу останавливаем захват, очищаем экран и ставим фильтр, исключающий все события, не отнносящиеся к PID = 3924.
(с лева на право)


Стартуем захват и даём нагрузку. Я просто подключаю "Администратор" и делаю небольшую выборку из произвольной таблицы. После чего захват можно остановить.
Первое, что бросилось в глаза - создание временного файла "C:\Windows\Temp\JET3B7.tmp".


Я сразу проверил папку "C:\Windows\Temp" и обнаружил там несколько сотен, небольших по размеру, файлов с началом "JET*.tmp". Понятно, что если на компьютере и по сети не открыта ни одна база "Access", то их быть не должно. Поэтому рекомендую тебе периодически заглядывать в эту папку и наводить там порядок.
Прокрутив ниже, легко обнаружить место, где создаётся файл "Lib.ldb" и небольшая запись в него, с использованием стандартного "IRP".


А дальше начинается самое интересное. Обрати внимание - блокировки кладутся на "Lib.ldb", а читается "Lib.mdb" и всё это методом "FASTIO_*". Кроме того, смещения, по которым блокируется "Lib.ldb", какие то запредельные: "Offset 268435457". Файл то ведь маленький!


Я знал, что "Lib.ldb" это файл блокировок. Но что в таком буквальном смысле, скажу честно, не ожидал. Не так давно я читал книгу "Внутреннее устройство Windows" М.Руссиновича и Д.Соломона (кстати "Процесс монитор" это творение Руссиновича, а книгу всячески рекомендую) и мне, похоже, удалось найти объяснение. Точнее это только версия, но весьма правдоподобная. Всё дело в многочисленных ограничениях, накладываемых системой на возможность выполнения операций "Быстрого" (FASTIO_) ввода-вывода. Их названия говорят за себя - обмен происходит напрямую с системным кэшем, минуя большое количество системных слоёв (драйверы ФС и т.д.). Одной из причин отклонения "FASTIO_*" является наложенная блокировка, поэтому их и вынесли в отдельный файл *.ldb. Есть системные счетчики, отвечающие за "FASTIO_*": "Кэш:Синхронных чтений/сек" и "Кэш:Не осуществлённых чтений/сек" (названия могут отличаться, для разных систем). Однако их показания меня не впечатлили. Если при подключении "Администратор" их зашкаливает (на графике красным цветом),


то на выборке небольшой таблицы их показания совсем не велики (а может, просто, этого достаточно?).


На больших выборках они вовсе никак себя не проявляют. Однако "Access", всё же настольная база.
Теперь несколько слов об удалении. Так удалять или нет? Когда то давно я читал рекомендации "Microsoft" по обслуживанию баз "Access" (сейчас, хоть убей, не могу найти). Там было чётко указано, что перед операцией "Сжать/Восстановить" необходимо удалить соответствующий файл блокировки. В данной ситуации лучше прислушаться к производителю. В остальном, в свете выше сказанного, вопрос сводится к следующему - могут ли в *.ldb "застрять" активные блокировки? При катастрофических сбоях наверное да. Но это автоматически приводит к операции "Сжать/Восстановить" и к удалению. А если ты просто принудительно "положил" "EServer" с подключенным клиентом, то вряд ли. Система зачистит ресурсы. Другое дело, если база открыта по сети, из "расшареной" папки. Но это уже не наш случай.