Ошибка сама по себе означает, что Firebird пытался выделить память для кэша буфера страниц, но не смог (потому что ОС исчерпала память или достигла максимального объема памяти, доступного для процесса). Проблема не связана с запросом проверки, трассировка стека показывает, что это происходит при создании нового соединения. И если пул не может выделить новое соединение для обслуживания вашего запроса, он откажется.
Исходя из нашего обмена в комментариях, похоже, что этот сервер Firebird настроен в режиме Classic Server (CS) или SuperClassic (SC). В этом режиме кэш буфера страниц относится к соединению, а не к базе данных (в режиме SuperServer (SS) - к базе данных). В результате, чем больше соединений, тем выше потребление памяти.
Это будет означать, что либо вы выделяете слишком много подключений, либо число настроенных страниц кэша слишком велико (применяется наиболее конкретная конфигурация - если установлена):
firebird.conf
настройка DefaultDbCachePages
) установлена слишком высоко (по умолчанию 75 для CS / SC и 2048 для SS)
- Настройка для базы данных (см.
gstat -h
вывод)
- Свойство подключения
isc_dpb_num_buffers
/ num_buffers
В случае Classic / SuperClassic это приводит к выделению NCachePages * Размер страницы байт памяти на соединение , где Pagesize - это размер страницы базы данных (обычно 8 или 16 килобайт) .
Например, при использовании по умолчанию 75 буферов для CS / SC с размером страницы 16 КБ каждое соединение занимает 1228800 (1,2 МБ) памяти для кэша), поэтому 100 подключений требуется 122 МБ (игнорируя другие потребности в памяти за пределами кэш).
С другой стороны, если этот параметр был изменен (либо глобально, в базе данных, либо с настройкой для каждого подключения), например, на 9999 страниц, то каждое подключение занимает 163 МБ памяти, а на 100 подключений потребуется 16 ГБ. .
Чтобы решить эту проблему, вам нужно выполнить одно или несколько из следующих действий:
- Уменьшите количество необходимых соединений (при хорошем пуле соединений и небольших единицах работы вы можете быть удивлены тем, как мало соединений вам нужно)
- Уменьшить количество страниц, выделенных для кеша
- Увеличение памяти, доступной для процесса Firebird
- Уменьшите размер страницы путем резервного копирования и восстановления базы данных с меньшим размером страницы
- Переключение в режим SuperServer вместо Classic / SuperClassic
Последние два могут привести к значительным изменениям производительности (возможно, положительным, возможно, отрицательным), поэтому их следует тщательно проверить.
В качестве обходного пути, если вы не можете заставить владельца изменить конфигурацию в кратчайшие сроки, рассмотрите возможность добавления свойства соединения num_buffers=75
(или аналогичного небольшого числа) в свойства вашего соединения.