
Администрирование, тюнинг и оптимизация БД 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 можно как уменьшить, так и оставить дефолтное значение или даже уменьшить.