Oracle DB: Библиотечный кэш

Материал из sysadm
Перейти к навигации Перейти к поиску

Ссылки по теме

Проблемы

В высоконагруженных базах данных могут возникать ситуации длительного ожидания Library cache pin. Лечится снятием сессии, первоначально захватившей ресурс. Если наступил коллапс и количество ожиданий слишком велико, то придется снимать все сессии. Если ситуации ожидания возникают часто, то это плохой признак и нужно разбираться в причинах.

Термины

  • Shared Pool (разделяемый пул) - область в SGA
  • Library cache (библиотечный кэш) - область в shared pool
  • Library cache pin - это событие ожидания одноимённой защёлки. Оно возникает при первоначальной загрузке объекта в библиотечный кэш, а также тогда, когда сеанс хочет изменить или проверить объект в памяти библиотечного кэша. Обычно это происходит в случаях выполнения, разбора объекта, его переопределения или изменения привилегий доступа к нему.

Структура библиотечного кэша

Библиотечный кэш состоит из связанного набора структур. В основе находится хеш-таблица, которая представляет собой набор бакетов (ячеек таблицы). Каждый бакет имеет свой индекс и содержит адрес начала двунаправленного списка дескрипторов объектов библиотечного кэша (Library Cache Object Handle). Дескрипторы в свою очередь указывают на структуры самих объектов библиотечного кэша (Library Cache Object или LCO). Обычно в бакете расположен список с всего одним дескриптором LCO, но бывает и так, что в результате так называемой хэш-коллизии в список указателей может попадать и несколько объектов.

LCO может содержать до 8 блоков данных, на которые он ссылается с помощью дескрипторов. Каждый блок имеет заголовок содержащий флаг статуса и счетчик PIN, указывающий на количество закреплений данного блока

Назначение блоков

  • Блок 0 – Object, информация о самом объекте
  • Блок 1 – Source, исходный код объекта
  • Блок 2 – DIANA, это промежуточный код PL/SQL объекта
  • Блок 3 - PCODE
  • Блок 4 – MCODE, здесь расположен машинно-зависимый код PL/SQL объекта;
  • Блок 5 - Errors
  • Блок 6 – SQL Context, здесь обычно храниться план выполнения
  • Блок 7 - Free

Важные динамические таблицы и их поля

  • x$kgllk - блокировки библиотечного кэша
    • kgllkuse – адрес сеанса;
    • kgllkhdl – дескриптор KGL объекта (объекта в Kernel Generic Library cache);
    • kgllkcnt – количество блокировок объекта;
    • kgllkmod – режим захвата блокировки;
    • kgllkreq – режим запроса блокировки;
  • x$kglpn – закрепления в библиотечном кэше
    • kglpnhdl – дескриптор KGL объекта;
    • kglpnuse – адрес сеанса;
    • kglpncnt – количество закреплений объекта в сеансе (включая зависимые объекты);
    • kglpnmod – режим захвата закрепления объекта;
    • kglpnreq – режим запроса закрепления объекта;
  • x$kglob –ресурсы библиотечного кэша
    • kglhdadr – дескриптор KGL объекта;
    • kglnaown – владелец ресурса;
    • kglnaobj – имя ресурса;
  • x$ksuse – текущие сеансы
    • addr – адрес сеанса;
    • ksusenum – идентификатор сеанса (SID);
    • ksuudlna – имя пользователя;
    • ksuseopc – номер события;
  • x$ksled – наименования событий
    • indx – индекс события;
    • kslednam – наименование события;
-- статистика библиотечного кэша
SELECT * FROM V$LIBRARYCACHE;
SELECT pinhitratio FROM V$LIBRARYCACHE WHERE namespace='SUMMARY';

-- список закреплений
-- если pin_req = 0, то закрепление произошло и ожидания нет
SELECT c.ksusenum sid, c.ksuudlna username, a.kglpncnt pin_cnt,
       a.kglpnmod pin_mode, a.kglpnreq pin_req, d.kslednam event, b.kglnaown, b.kglnaobj
  FROM x$kglpn a, x$kglob b, x$ksuse c, x$ksled d
 WHERE b.kglhdadr = a.kglpnhdl AND a.kglpnuse = c.addr AND 
       c.ksuseopc = d.indx;

-- список блокировок
-- если lck_req = 0, то блокировка произошла и ожидания нет
SELECT c.ksusenum sid, c.ksuudlna username, a.kgllkcnt lck_cnt,
       a.kgllkmod lck_mode, a.kgllkreq lck_req, d.kslednam event, b.kglnaown, b.kglnaobj
  FROM x$kgllk a, x$kglob b, x$ksuse c, x$ksled d
 WHERE b.kglhdadr = a.kgllkhdl AND a.kgllkuse = c.addr AND 
       c.ksuseopc = d.indx;

-- снятие дампа библиотечного кэша для последующего анализа
ALTER SESSION SET EVENTS 'immediate trace name library_cache level 32';

Режимы защелки

  • 0 - нет
  • 1 - null
  • 2 - shared
  • 3 - монопольный

Перед защелкой Library cache pin всегда идет защелка Lock. Если объект закрепляется в монопольном режиме (защелка pin), то последующая попытка закрепления в монопольном режиме приведет к блокировке (защелка Lock) в монопольном режиме. Т.к. защелка Lock всегда предшествует защелке PIN, то это полностью заблокирует любое использование объекта.