Замедление Firebird, пока ресурсы доступны

У меня странная проблема с замедлением работы с базой данных Firebird. Во время ежедневного использования базы данных клиенты испытывают значительные замедления, в то время как система все еще имеет много доступных ресурсов. Некоторая информация об окружающей среде:

  • 64-битный сервер Firebird 2.5.2, работающий в режиме SuperServer
  • база данных работает на 64-битной операционной системе сервера Windows 2008 R2
  • серверная ОС работает в VMware 4.1 VM с 4 ядрами процессора и 16 ГБ оперативной памяти
  • размер базы данных составляет около 37 ГБ, а количество одновременных подключений к базе данных составляет около 150.

Наблюдая за замедлением:

  • загрузка процессора на машине составляет 40-60% без высоких пиков, а нагрузка хорошо распределяется между всеми 4 ядрами
  • использование памяти сервером составляет около 4-6 ГБ, а остальная часть памяти используется в качестве кэша ОС
  • Длина очереди диска почти никогда не превышает 0,3 с задержкой около 2-5 мс
  • на сервере почти нет сетевой активности.

Тем не менее замедление, по-видимому, связано с общей нагрузкой на сервер. В течение ночи, когда к базе данных не подключено ни одного пользователя / фоновые задания не выполняются, тестовый запрос, используемый для ссылки, выполняется через 4-5 секунд, в то время как в течение дня, когда все пользователи подключаются к базе данных, для выполнения одного и того же ссылочного запроса требуется 60+. секунды, чтобы закончить. Следует добавить, что замедление носит общий характер, нет конкретных запросов, которые медленнее, пока сервер находится под нагрузкой, в конкретной базе данных Firebird все замедляется. На сервере есть другие базы данных с очень небольшим числом транзакций, выполняемых ежедневно, и эти другие базы данных не показывают никаких признаков замедления. Я даже создал копию действующей базы данных с замедлением и выполнил один и тот же запрос как к исходной, так и к дублирующей базе данных - оригинал действительно выполнял запрос медленно и быстро дублировал. Единственное различие между оригиналом и дубликатом, которое я знаю, заключается в количестве подключенных пользователей / одновременных транзакций.

Поскольку я не нашел очевидных причин всего этого в доступных ресурсах ОС, поэтому я попытался получить статистику из Firebird.

Наблюдения:

  • в пиковые моменты времени база данных имеет 30-40 транзакций, работающих параллельно в соответствии с инструкциями mon$ (где mon$state == 1, что в соответствии с архивами означает, что транзакции выполняются или ожидают блокировки)
  • fb_lock_print отображает следующее о базе данных:

LOCK_HEADER BLOCK

    Version: 145, Active owner:      0, Length: 2097152, Used: 1335440
    Flags: 0x0001
    Enqs: 9993237, Converts:  93191, Rejects: 1417230, Blocks:      2
    Deadlock scans:      0, Deadlocks:      0, Scan interval:  10
    Acquires: 19972846, Acquire blocks:      0, Spin count:   0
    Mutex wait: 0.0%
    Hash slots: 1009, Hash lengths (min/avg/max):    0/   2/   7
    Remove node:      0, Insert queue:      0, Insert prior:      0
    Owners (38):    forward:  20824, backward: 872088
    Free owners (126):      forward: 973360, backward: 728016
    Free locks (370):       forward: 852200, backward: 195936
    Free requests (12425):  forward: 614608, backward: 1230536
    Lock Ordering: Enabled

Здесь я отметил, что поле "отклоняет" составляет ~14% поля "enqs", но, к сожалению, я не знаю точного значения этих значений. Я предполагаю, что около 14% запросов на блокировку по какой-то причине отклоняются, но я могу быть совершенно неправ.

Итак, вопросы:

  • Как следует интерпретировать вывод fb_lock_print в этом случае? Являются ли эти цифры "неправильными" в некотором смысле? Могут ли они быть улучшены путем настройки некоторых параметров?
  • Какие дополнительные шаги следует предпринять, чтобы точно определить причины замедления?

0 ответов

Я использую 32-битную версию Firebird (версия 2.5.2), и с тех пор как месяц доступ к базе данных замедляется, когда инструмент nbackup начинает блокировать базу данных. После того, как база данных разблокирована с помощью nbackup, запросы снова работают нормально быстро. Мы используем nbackup -L / nbackup -N для копирования файла базы данных с помощью fastcopy.

Другие вопросы по тегам