Обзор способов повышения производительности кубов Essbase

Даже приложениям, разработанным с учётом базовых рекомендаций вроде расстановки измерений в виде «песочных часов», можно и нужно повышать производительность. Например, следующими способами:

– Перезагрузка кубов
– Дефрагментация кубов
– Тонкая настройка Essbase (кэш, диски, транзакционный контроль)
– Тюнинг оперативной памяти 32-битной архитектуры (Microsoft 4GT)
– Переход на 64-битную архитектуру


Перезагрузка кубов

Под перезагрузкой понимается выгрузка данных (data export) с дальнейшей очисткой куба (reset) и загрузкой данных обратно (data import).
Reset очищает кубы от всех данных и LRO (linked-reporting objects).

MaxL: alter database appname.dbname reset
ESSCMD: RESETDB


Дефрагментация кубов

При записи данных в куб неизбежно происходит его фрагментация: блоки данных физически записываются в разные места диска, что приводит к увеличению времени чтения данных. И хоть Essbase некоторым образом группирует «соседние» данные на диске, есть ситуации, которые скорее всего увеличат степень фрагментации файла данных:

– Чтение/запись куба, который активно пополняется новыми данными
– Непрерывный расчет данных в кубе
– Частое обновление или пересчет элементов плотных изменений
– Некорректно разработанная загрузка данных
– Большое число элементов типа Dynamic Calc and Store

Нужно периодически мониторить степень фрагментации кубов и уменьшать её при необходимости.

Выяснить степень фрагментации можно одним из следующих способов:

– Average fragmentation quotient, возвращаемый ESSCMD-командой GETDBSTATS
– Average clustering ratio в статистике куба (EAS Console)

Нормой считаются следующие значения коэффициентов:

– Average clustering ratio > 0,7 (значение 1 указывает на отсутствие фрагментации)
– Average fragmentation quotient < 60% для кубов до 200 Мб
– Average fragmentation quotient < 40% для кубов до 2 Гб
– Average fragmentation quotient < 30% для кубов более 2 Гб

Если условия не выполняются, следует задуматься о дефрагментации, которая может выполняться следующими способами:

– Экспорт данных – CLEARDATA – импорт данных
– MaxL: alter database dbname force restructure

Снизить степень фрагментации в процессе загрузки данных можно правильной расстановкой элементов разреженных измерений.


Тонкая настройка Essbase

Настройки кэшей, дисков и транзакционного контроля, как и большинство базовых операций в Essbase, можно проводить в EAS Console или командами MaxL/ESSCMD.

Настройка кэшей

Вкладка Caches свойств куба в EAS Console.

Index cache size

Кэш индексных файлов (.ind). Во время работы с кубом заполняется последними запрошенными индексами (пересечениями разреженных изменений). Эффективность выделенного размера кэша зависит от способа работы с кубом. Например, при полной загрузке и пересчете куба, основная работа заключается в создании новых блоков данных, а не в поиске данных по существующим блокам с использованием индекса – в этом случае увеличение размера кэша индексных файлов почти не скажется на производительности. И обратно, если куб преимущественно используется для выдачи хранящихся в нём данных, то производительность будет хорошо отзываться на увеличение размера кэша.

Минимальное значение: 1024 Кб
Значение по умолчанию: 1024 Кб (10240 Кб при прямом доступе к диску – direct I/O)
Рекомендованное значение: максимально близко к суммарному размеру индексных файлов

MaxL: alter database appname.dbname set index_cache_size n
ESSCMD: SETDBSTATEITEM 12

Data file cache size

Кэш файлов данных (.pag). Используется только в случае прямого доступа к диску. При буферном доступе к диску (buffered I/O) этот кэш не используется. В общем случае, чем больше размер кэша, тем лучше.

Минимальный размер: 10240 Кб
Размер по умолчанию: 32768 Кб
Рекомендованный размер: максимально близко к суммарному размеру файлов данных

MaxL: alter database appname.dbname set data_file_cache_size n
ESSCMD: SETDBSTATEITEM 27

Data cache size

Кэш блоков данных. При выполнении запроса к данным, Essbase сначала наличие необходимого блока в кэше, и если находит, то сразу отдает. Если же не находит, то ему приходится искать в индексе ссылку на нужный блок и доставать его из файла данных. Это заметно увеличивает время выполнения запроса.

Минимальный размер: 3072 Кб
Размер по умолчанию: 3072 Кб
Рекомендованный размер: (Data file cache)/8

Имеет смысл повышать его размер в следующих случаях:
– Одновременный доступ к различным данным большого числа пользователей
Расчетные скрипты содержат функции, требующие использования большого числа элементов разреженных измерений, например @Rank или @Range
– При больших размерах блоков данных и включенной настройке DLTHREADSWRITE High

На 64-битных платформах размер кэша может достигать 4 Гб, это максимально возможное значение. Но оно может быть увеличено настройкой MEMSCALINGFACTOR в essbase.cfg.

MaxL: alter database appname.dbname set data_cache_size n
ESSCMD: SETDBSTATEITEM 5

Cache memory locking

Параметр, указывающий на жесткое выделение памяти, указанной в настройках кэшей, т.е. на приоритетное использование RAM в требуемых объёмах без надобности в файле подкачки. Работает только при использовании прямого доступа к диску (direct I/O). По умолчанию параметр отключен. При включении рекомендуется оставлять хотя бы треть физической памяти под систему.

MaxL: alter database appname.dbname enable cache_pinning
ESSCMD: SETDBSTATEITEM 26

Подробнее о кэшах здесь.

Настройка дисков

Указание пути для размещения индексных файлов (ess*.ind) и файлов данных (ess*.pag), а также их свойств. Файлы записываются в папку ../app/AppName/DBName указанного размещения. По умолчанию файлы находятся в папке %ARBORPATH%. Изменение настройки требует перезагрузки Essbase и действует на файлы, которые только будут создаваться в будущем – существующие файлы и их размещение не затрагиваются.

Доступны следующие настройки:
– Наименование размещения (Volume name)
– Объем доступного места на диске (Partition Size в EAS, Volume Size в ESSCMD); если значение не задать, Essbase будет использовать полный объём диска
– Тип файлов: только индексные, только файлы данных, либо оба типа (значение по умолчанию)
– Максимальный размер файла: рекомендованное и используемое по умолчанию значение – 2 Гб

Новые файлы создаются в следующих случаях:
– При его достижении максимального размера файла (2 Гб), например при увеличении ess00001.ind до 2097152 Кб, новые индексные записи будут размещаться в файле ess00002.ind
– При достижении суммарным объемом файлов указанного типа объема доступного места на диске, например вы отдали под Essbase 8 Гб на диске D и 16 Гб на диске E, тогда при заполнении D файлами ess00001.ind, ess00002.ind, ess00001.pag и ess00002.pag по 2 Гб каждый, будут созданы новые файлы ess00001.ind и ess00001.pag уже на диске E

Файлы именуются последовательно от ess00001.* до ess65535.* в каждом из размещений.

При настройке стоит обратить внимание на следующие моменты:
– Доступные размещения используются последовательно, по порядку заведения в настройках
– Необязательно держать .ind и .pag файлы там же, где был развернут Essbase
– Если заполняются все доступные размещения, Essbase прекращает все текущие операции и выдает ошибку класса FATAL; для продолжения работы нужно остановить Essbase, добавить новые размещения и снова запустить Essbase
–  Можно дать Essbase команду прекратить запись в определенное размещение, для этого надо выбрать его в EAS и нажать Delete, тогда запись в размещение прекратится, но уже существующие данные будут доступны в режиме чтения

Administration Services: Database Properties / Storage
MaxL: alter database appname.dbname set disk volume
ESSCMD: SETDBSTATEITEM 23
ESSCMD: SETDBSTATEITEM 24

Настройка транзакционного контроля

Isolation level

Задание способа фиксации (commit) данных на диске. Essbase автоматически фиксирует данные на диске, но этот процесс можно регулировать. Есть два вида фиксации – committed access и uncommitted access (значение по умолчанию).

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

В случае uncommitted access, доступ к блокам данных ограничивается только на время их записи (block-by-block read/write locks). Но их фиксация (commit) происходит только при окончании транзакции, либо при достижении определенного настраиваемого порога (synchronization point).

MaxL: alter database appname.dbname enable committed_mode
ESSCMD: SETDBSTATEITEM 18

Commit Blocks

Число блоков данных, при достижении которого в режиме uncommitted access происходит их фиксация на диск (commit at synchronization point). Значение по умолчанию: 3000. Если выставить значение 0, то фиксация будет осуществляться при закрытии транзакции.

MaxL: alter database appname.dbname enable committed_mode
MaxL: alter database appname.dbname set implicit_commit after n blocks
ESSCMD: SETDBSTATEITEM 21

Commit Rows

Число строк загруженных данных, при достижении которого в режиме uncommitted access происходит их фиксация на диск. При значении 0 фиксация на диск будет осуществляться в момент окончания загрузки данных.

MaxL: alter database appname.dbname enable committed_mode
MaxL: alter database appname.dbname set implicit_commit after n rows
ESSCMD: SETDBSTATEITEM 22

Взаимодействие Commit Blocks и Commit Rows

Фиксация данных происходит в момент достижения минимального порогового значения. Например, при commit blocks = 20 и commit rows = 0, фиксация будет происходить каждые 20 записанных блоков. В при commit blocks = 10 и commit rows = 10 – в зависимости от того, что наступит раньше.

Wait for write access to locked data block

Опция снятия блокировок в случае committed access. По умолчанию, в случае занятого блока транзакция будет ждать его освобождения (Indefinite wait). Также, можно указать моментальный доступ (Immediate access, он же Nowait), тогда в случае попадания транзакции на занятый блок выдается ошибка (lock timeout message) и транзакция прерывается. Есть ещё одна возможность – указание времени ожидания в секундах, по истечении которого всё происходит аналогично Immediate access.

MaxL: alter database appname.dbname set lock_timeout
ESSCMD: SETDBSTATEITEM 20

Pre-image access

Опция доступа к блокам при committed access. По умолчанию включена, что означает, что пользователи имеют доступ на чтение к занятым блокам и видят их значения на момент до начала текущего незавершенного изменения.

MaxL: alter database appname.dbname enable pre_image_access
ESSCMD: SETDBSTATEITEM 19

Дополнительные настройки Essbase

Retrieval buffer size

Буфер доступа к данным. Область, в которую разжимаются данные перед отправкой результата запроса. При заполнении буфера, содержащиеся в нём данные уходят в результат запроса, освобождая место для новых записей. Используется такими утилитами как Essbase Retrieval Wizard или Report Writer. К увеличению времени доступа к данным может приводить как слишком маленький, так и слишком большой размер буфера.

Значение по умолчанию: 10 Кб для 32-битного Essbase и 20 Кб для 64-битного
Рекомендованный размер: не более 100 Кб (при максимально возможных 100000 Кб)

Есть возможность включения динамического определения размера буфера (VLBREPORT TRUE), но со следующими ограничениями:
– Данные выбираются из нескольких блоков, причём в размере не менее 20% ячеек из каждого
– В измерениях куба отсутствуют элементы типов Dynamic Calc и Dynamic Times Series, а также атрибутивные измерения

MaxL: alter database appname.dbname set retrieve_buffer_size n
ESSCMD: SETDBSTATEITEM 16

Retrieval sort buffer size

Буфер сортировки данных запроса. Значения по умолчанию аналогичны Retrieval buffer.
Если вам встречается ошибка, говорящая о превышении доступного Retrieval sort buffer, увеличьте его значение вдвое.

MaxL: alter database appname.dbname set retrieve_sort_buffer_size n
ESSCMD: SETDBSTATEITEM 17

Data compression

Essbase предлагает следующие типы сжатия хранящихся на диске данных:
– Bitmap (значение по умолчанию): хранение только непустых значений и сжатие их по схеме bitmap
– Run-length encoding (RLE): сжатие на базе повторяющихся значений, включая #MISSING и нулевые значения
– Zlib: сжатие на базе словаря значений
– Index Value Pair: сжатие блоков данных с плотностью менее 3%
– Без сжатия: данные записываются на диск в несжатом виде

На практике чаще всего применяются Bitmap и RLE.

MaxL: alter database appname.dbname enable compression
MaxL: alter database appname.dbname set compression type
ESSCMD: SETDBSTATEITEM 14
ESSCMD: SETDBSTATEITEM 15

Подробней о видах сжатия данных в Essbase читайте здесь.

Maximum memory for trigger definitions

Триггеры – это удобный инструмент мониторинга состояния Essbase. При возникновении описанных в триггере условий происходит запись в лог; для некоторых триггеров может осуществляться отправка электронных писем.

Есть два типа триггеров:
– On-update: исполняются при доступе к данным, в момент размещения целевого блока данных в оперативную память (поддерживаются только в BSO)
– After-update: исполняются по завершении транзакций

MaxL: create or replace trigger
MaxL: alter trigger
MaxL: display trigger
MaxL: drop trigger

Примеры и подробное описание триггеров – здесь.


Тюнинг оперативной памяти

У Microsoft есть технология 4Gb RAM Tuning (4GT), которая вполне применима к Essbase.

На 32-битной архитектуре по умолчанию 2 Гб оперативной памяти отводится под систему. При наличии 4 Гб RAM, данная технология позволяет увеличить доступное приложениям (в т.ч. Essbase) количество оперативной памяти с 2 до 3 Гб путем снижения резерва системы до 1 Гб. Поддерживается на процессорах Intel и Windows Server 2000/2003.

Дополнительные условия, накладываемые на конфигурацию Essbase:

– Включенный режим прямого доступа к диску (direct I/O), при buffered I/O использование 4GT не рекомендовано
– Index cache и Data cache настроены корректно, производительность поддерживается постепенным повышением кэша файла данных, но он упирается в ограничение в 2 Гб

Для включения режима 4GT надо добавить в строку загрузки системы boot.ini параметр /3GB, например:

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(2)\WIN2KADV
[operating systems]
multi(0)disk(0)rdisk(0)partition(2)\WIN2KADV=
“Microsoft Windows 2000 Advanced Server” /3GB

Есть и другие возможности тюнинга Windows.

Переход на 64-битную архитектуру

Как известно, x64-системы снимают ограничение в 3 Гб на доступную приложениям оперативную память. Для этого случая есть 64-битная версия Essbase, обладающая следующими преимуществами (кэши, многопоточность и другие) перед 32-битной (32 bit → 64 bit):

– RAM: 3 Гб → (бесконечность)
– Retrieval buffer: 10 Кб → 20 Кб
– Retrieval sort buffer: 10 Кб → 20 Кб
– AGENTTHREADS: 500 → 1024
– SERVERTHREADS: 500 → 1024
– DLTHREADSPREPARE: 16 → 32
– DLTHREADSWRITE:16 → 32
– BSO Parallel Calc Threads: 4 → 8
– ASO Parallel Load Threads: 16 → 32
– Достижимое число элементов измерений в кубе: 8 млн. → (бесконечность)
– Рекомендуемый размер блока: до 100 Кб → до 1 Мб
– И другие…