Поиск по этому блогу

среда, 21 декабря 2011 г.

Администрирование DB2. Буферные пулы


Производительность работы главным образом зависит от настройки буферных пулов.
И к их созданию и конфигурации стоит подойти со всей ответственностью )

Правила
Размер страницы табличного пространства и размер страницы буферного пула одинаковы для всех табличных пространств, обслуживаемых буферным пулом.
При создании размер страницы пула буферов (Page Size) НЕЛЬЗЯ изменить после его создания. (Можно только удалить буф.пул и создать его с новым значением)
Page Size может принимать значения 4, 8, 16, 32 Kb

Параметры буферных пулов
PAGESIZEразмер страницы пула буферов 4, 8, 16, 32 Kb
EXTENTSIZEразмер экстента, число страниц, которые будут записаны в контейнер, прежде чем перейти к следующему контейнеру
PREFETCHSIZE количество страниц, считываемых из табличного пространства при предварительной выборке данных. Система сама решает, что производительность можно повысить за счет считывания данных до того, как они будут указаны в запросе.
OVERHEAD – издержки контроллера на операции чтения-записи (I/O), зависит от оборудования

Узнать более подробную информацию о буферных пулах можно из системной таблицы syscat.bufferpools

db2 «select BPNAME, BUFFERPOOLID, NPAGES, PAGESIZE, ESTORE from syscat.bufferpools» 
 
Запрос покажет сколько оперативной памяти потребуется для буферных пулов (округление до КИЛО в большую сторону)
db2 "select BPNAME, BUFFERPOOLID, NPAGES*ceil(PAGESIZE*0.001) from syscat.bufferpools 
union 
select 'all', 0, sum(NPAGES*ceil(pagesize*0.001)) from syscat.bufferpools"
 

NPAGES*PAGESIZE — и есть тот размер, который занимает буферный пул в памяти
Каждое табличное пространство содержит один или несколько контейнеров. Контейнер это файл на диске, для DMS (управляется БД) табличных пространств или путь для SMS (управляется системой) табличных пространств.
SMS - System manage, управляются системой, контейнеры хранятся в определенной директории.
DMS - Database manage, управляются базой данных, контейнеры хранятся в файлах.

 Еще два важных параметра связанные с буферными пулами -
NUM_IOCLEANERS - количество чистильщиков страниц, утилита по удалению страниц которые помечены для очистки clean for reuse, ее задача  переписать измененные (грязные) страницы из буферного пула на диск.
Если БД интенсивно пишет (INSERT, UPDATE) то рекомендовано увеличивать этот параметр. Для Selectа вполне может хватить и значения по умолчанию. DB2 9.7 устанавливает этот параметр автоматически automatic.
CHNGPGS_THRESH - Устанавливает пороговую величину в процентах по достижению которой DB2 запускает утилиту очистки.
Предельная доля измененных страниц (CHNGPGS_THRESH) = 50
В данном случае, когда доля измененных страниц достигает 50%, запускается чистильщик.


МОНИТОРИНГ буферных пулов
Включаем
db2 -v update monitor switches using bufferpool on //включить мониторинг
db2 -v get monitor switches db2 -v reset monitor all
Мониторим
-- выполняем приложение --
db2 -v get snapshot for all databases > snap1.out
db2 -v get snapshot for dbm >> snap2.out
db2 -v get snapshot for all bufferpools >> snap3.out
Выключаем
db2 -v reset monitor all db2 -v terminate сброс мониторов
db2 -v update monitor switches using bufferpool off

Изменение буферных пулов
db2 alter bufferpool ibmdefaultbp size 10000 AUTOMATIC

Параметр AUTOMATIC в 9.7 уже есть и говорит о том, что пул будет расти автоматически

Если вам удалось накосячить и задать слишком большой размер буферного пула, то DB2 запустить скрытые буферные пулы, а в db2diag.log напишет:
BufferPool memory allocation failed...
buffer pool ID "1", but this buffer pool is not active at this time...
Database will come up with hidden buffer pools.

Команды для просмотра буферных пулов
Список табличных пространств в БД мы можем получить командой
db2 list tablespaces show detail
Информация о контейнерах для этого табличного пространства - db2 list tablespace containers for [указываем ID пространства] show detail.
db2 list tablespace containers for 3 show detail

Вывод
ID табличного пространства = 0
Имя = SYSCATSPACE
Тип = Пространство, управляемое системой
Содержимое = Все постоянные данные. Обычное таблич▒
Состояние = 0x0000
Подробное объяснение:
Нормальное состояние
Всего страниц = 93057
Используется страниц = 93057
Используется страниц = 93057
Свободно страниц = Не применимо
Максимальный уровень используемых страниц = Не применимо
Размер страницы (байт) = 4096
Размер экстента (страниц) = 32
Размер предварительного чтения (страниц) = 128
Число контейнеров = 1
Минимальное время восстановления = 2010-06-25-07.50.19.000000

Еще один способ (более удобный) - команда
db2pd -db [База данных] -tablespaces  

Tablespace Configuration:
Address Id Type Content PageSz ExtentSz Auto Prefetch BufID BufIDDisk FSC NumCntrs MaxStripe LastConsecPg Name
0x00002B49853FD920 0 SMS Regular 4096 32 Yes 128 4096 1 On 1 0 31 SYSCATSPACE
Tablespace Statistics:
Address Id TotalPgs UsablePgs UsedPgs PndFreePgs FreePgs HWM Max HWM State MinRecTime NQuiescers PathsDropped
0x00002B49853FD920 0 93057 93057 93057 0 0 0 0 0x00000000 1277452219 0 No
Tablespace Autoresize Statistics:
Address Id AS AR InitSize IncSize IIP MaxSize LastResize LRF
0x00002B49853FD920 0 No No 0 0 No 0 None No
Еще более удобный способ получить информацию о состоянии, предложенный Mark Barinstein на форуме sql.ru
select char(TBSP_NAME, 20), TBSP_STATE from SYSIBMADM.SNAPTBSP_PART where TBSP_NAME in ('SYSCATSPACE', ' TEMPSPACE1', … через зпт перечисляем табличные пространства) 

Какие таблицы размещаются в этом табличном пространстве
SELECT NAME, CTIME, INDEX_TBSPACE, status,
NPAGES, FPAGES
FROM SYSIBM.SYSTABLES
where TBSPACE = 'Имя табличного пространства'

Табличные пространства в ненормальном состоянии
SELECT * FROM SYSIBMADM.SNAPTBSP_PART where TBSP_STATE<>'NORMAL'

Состояние табличного пространства отображается в виде hex кода (в команде list), чтобы узнать что имела в виду db2 под этим кодом можно использовать команду db2tbst
Пример.
$ db2tbst 0x02001100
State = Restore Pending + Storage Must be Defined + Storage May be Defined

В данном случае у нас не были определены контейнеры для этого табличного пространства, и при восстановлении БД оно перешло в состояние отложенного восстановления.
  Чтобы пофиксить подобные ошибки создаем контейнер (директорию), даем на нее права, выполняем запрос
db2 "backup db [имя бд] on dbpartitionnums(0,1,2,3,4,5,6) tablespace (USERSPACE1) online to /db2inst/db without prompting"
dbpartitionnums берем из SYSIBMADM.SNAPTBSP_PART
Или dropаем бд, создаем директории, даем права, восстанавливаем повторно.

Список системных таблиц в которых есть информация о буферных пулах

SYSCAT.TABLESPACES - табличные пространства
SYSIBM.SYSBUFFERPOOLS — буферные пулы
SYSIBMADM.SNAPTBSP_PART — состояние tbs

Еще почитать

   0x0          Normal
   0x1          Quiesced: SHARE
   0x2          Quiesced: UPDATE
   0x4          Quiesced: EXCLUSIVE
   0x8          Load pending
   0x10         Delete pending
   0x20         Backup pending
   0x40         Roll forward in progress
   0x80         Roll forward pending
   0x100        Restore pending
   0x100        Recovery pending (not used)
   0x200        Disable pending
   0x400        Reorg in progress
   0x800        Backup in progress
   0x1000       Storage must be defined
   0x2000       Restore in progress
   0x4000       Offline and not accessible
   0x8000       Drop pending
   0x2000000    Storage may be defined
   0x4000000    StorDef is in 'final' state
   0x8000000    StorDef was changed prior to rollforward
   0x10000000   DMS rebalancer is active
   0x20000000   TBS deletion in progress
   0x40000000   TBS creation in progress
   0x8          For service use only