PostHeaderIcon

Администрирование, тюнинг и оптимизация БД Firebird

Стандартные шаги по оптимизации производительности можно разделить на 3 группы:

 

  • Тюнинг базы - изменение неоптимальных дефолтных настроек
  • Оптимизация кода - выявление медленных запросов
  • Конфигурирование сервера - изменение конфигурации "железа" под оптимальную производительность

 

Начнем с настроек БД Firebird(так же актуально для Interbase). В качестве платформы выбран Firebird 2.5 64bit в режиме superserver. Выбор основан на основании стабильной работы данной версии Firebird под ОС FreeBSD 10, более поздний версии - 3.х и т.д. скорей всего так же будут успешно работать, но необходимости перехода на них не возникало, а ставить все самое новое, но не нужное, можно позволить только от скуки)

Для ОС Linux(Ubuntu, CentOS, Debian и т.д.) все это так же актуально

В качестве основы берем, что Firebird установлен на сервер, а не на ПиСюк, т.е. имеется в наличии ИБП(UPS), аппаратный или железный RAID-массив, как минимум "зеркало" или mirror или по простому RAID-1.

Для начала переводим БД в асинхронный режим записи на диск - сначала все данные пишутся в кеш и постепенно сбрасываются на диск, при большом количестве INSERT-ов это сильно ускорит работу базы и как следствие и приложения(сайта), который в нее смотрит.

Проверяем текущее состояние:

# fbstat -h <имя базы или полный путь к ней> | grep Att
Attributes force write

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

Меняем режим записи:

# gfix -write async <имя базы или полный путь к ней>

и проверяем результат:

# fbstat -h <имя базы или полный путь к ней> | grep Att
Attributes

все ОК, можно продолжать дальше...

Далее меняем дефолтрые параметры в конфиге БД на оптимальные - в FreeBSD это /usr/local/etc/firebird/firebird.conf(для Linux это скорей всего /etc/firebird/firebird.conf), тут все зависит от количества памяти и от количества одновременных сессий(пользователей) на Вашем сайте или приложении, в моем случае пользователей мало(не более 10) но объемы данных большие, исходя из этого, а так же из размера оперативной памяти сервера, я выбрал следующие параметры:

DefaultDbCachePages = 4096
TempBlockSize = 2048576
TempCacheLimit = 967108864
LockMemSize = 4096000

Ключевой параметр, влияющий на потребление оперативной памяти - LockMemSize, он вычисляется по формуле: DefaultDbCachePages * количество одновременных сессий * 100

Если объемы данных значительно меньше или количество коннектов больше, то DefaultDbCachePages можно как уменьшить, так и оставить дефолтное значение или даже уменьшить.