Сборка мусора. gbak и gfix

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Хрущев Роман
Сообщения: 3
Зарегистрирован: 18 дек 2006, 07:43

Сборка мусора. gbak и gfix

Сообщение Хрущев Роман » 18 дек 2006, 08:03

Здравствуйте!
Почитал я статьи на сайте про сборку мусора
и у меня возник такой вопрос:
в чем разница gbak.exe (без ключа -g) и gfix.exe -sweep

Стоит ИБ7.5, днем очень активная работа с базой идет.
Каждую ночь делается бэкап gbak (без ключа -g)
Надо ли после этого еще gfix -sweep делать?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 18 дек 2006, 08:44

в чем разница gbak.exe (без ключа -g) и gfix.exe -sweep
странно. статьи прочитал, а разницу не понял :-)

разница лишь в том, что задача gbak - это сделать резервную копию.
А без ключа -g он занимается КООПЕРАТИВНОЙ сборкой мусора.
gfix -sweep это ПРИНУДИТЕЛЬНАЯ сборка мусора.
ну и еще, gbak без -g не может продвинуть застрявший oit. так что если он застрял, sweep пускать придется все равно.

поэтому, вызывать gbak без ключа -g - сомнительное занятие.

Хрущев Роман
Сообщения: 3
Зарегистрирован: 18 дек 2006, 07:43

Сообщение Хрущев Роман » 18 дек 2006, 09:04

разница лишь в том, что задача gbak - это сделать резервную копию
это я знаю что gbak делает бэкап :)
меня интересовало действия gbak по сборке мусора.
вызывать gbak без ключа -g - сомнительное занятие
почему?

значит все-таки лучше делать:
резервную копию базы gbak -g , а потом gfix -sweep

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 18 дек 2006, 10:45

kdv писал(а):ну и еще, gbak без -g не может продвинуть застрявший oit. так что если он застрял, sweep пускать придется все равно
Никто, кроме sweep, не может продвинуть застрявший OIT.
Собственно sweep нужен именно для этого

Хрущев Роман
Сообщения: 3
Зарегистрирован: 18 дек 2006, 07:43

Сообщение Хрущев Роман » 18 дек 2006, 13:31

http://www.ibase.ru/devinfo/hddspeed.htm
Сборка мусора
Старт sweep может проявляться как внезапное замедление работы в течение дня или через несколько дней после restore. Когда подобные "замедления" неприемлемы, имеет смысл отключить автоматическую сборку мусора утилитой gfix (-housekeeping 0), и делать sweep вручную (тем же gfix) или при backup (без ключа -g).
Это ПРИНУДИТЕЛЬНАЯ сборка мусора.
http://www.ibase.ru/devinfo/garbage.htm
Кооперативная сборка мусора срабатывает при чтении. Под чтением кроме select также подразумеваются и update и delete.
- кооперативная фоновая. Появилась в IB 6 SuperServer. Сборкой мусора занимается отдельный thread...
Процесс с именем COLLECTOR занимается КООПЕРАТИВНОЙ сборкой мусора.

Всё-таки получается gbak не связан с кооперативной сборкой мусора.
А отличия только в том что gbak не может продвинуть застрявший OIT.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 18 дек 2006, 15:53

ээээ...
кооперативная сборка мусора - это сборка мусора при его обнаружении. Мусор обнаруживается в основном при чтении данных.

gbak, это такая программа, которая стартует транзакцию snapshot, и читает ВСЕ данные в БД. Следовательно, gbak как и любая другая программа, работающая с БД, будет заниматься кооперативной сборкой мусора.

Но, gbak как обычная программа, не может делать действия, которые выполняет gfix -sweep. Как минимум - подвигать вперед OIT.
почему?
потому что если вызывать gbak без ключа -g, то это приведет к кооперативной сборке мусора, что ЗАМЕДЛИТ работу сервера вообще и gbak в частности. На разных версиях серверов это действует по разному, особенно влияет сборка мусора в неуникальных индексах. Но и это побеждено в IB 7.1/FB 2.0.

Вообще, лично я смысла запускать gbak без -g вообще не вижу. Есть мусор, нет мусора - задача gbak сделать резервную копию.
Можно, конечно, опосредованно возложить на него запуск кооперативной сборки мусора, но на старых версиях сервера (см. выше) это все будет происходить значительно медленнее, чем просто запустить gfix -sweep.

Можно самостоятельно произвести эксперимент: отрубить автоматический sweep в базе, и мониторить накопление мусора ibanalys-ом. Если мусора наберется много, то
1. остановить сервер
2. скопировать БД
3. запустить gbak -b
посмотреть на загрузку сервера, и время выполнения.

4. затем остановить сервер, подсунуть серверу копию БД
5. запустить gbak -b -g
сравнить время и загрузку с пунктом 3

обязательно надо иметь в виду, что кооперативная фоновая (а не явная) сборка мусора в IB 6 и выше имела слишком низкий приоритет, поэтому когда она начиналась по всей базе, невозможно было предсказать момент ее окончания. А тушить сервер при работающей сборке мусора - опасно для базы.

Вот собственно, аргументы, которые и изложены в упомянутых статьях.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 18 дек 2006, 17:22

обновил вариант, где описал это.

www.ibase.ru/devinfo/garbage.htm#backup

Ответить