[freebsd] zfs defrag

Владимир Друзенко vvd at unislabs.com
Fri Nov 24 18:16:35 EET 2017


24.11.2017 17:03, Mikhail Golub пишет:
> Всем привет.
>
> Как я понял по информации с просторов Интернет, то единственный способ 
> дефрагментировать zfs пул - "zfs send | zfs recv".
>
> Имеется FreeBSD 11.1
> Есть пул с FRAG 62%.
> В пуле файловые системы с сайтами (у каждого сайта своя ФС с квотами и 
> т.п.). И через определенные интервалы времени делается снимок ФС для 
> оперативного бэкапа и хранятся такие снимки некоторое время.
> Т.е. имеем несколько ФС и у каждой ФС по несколько снапшотов.
>
> Нашел пример, что можно сделать вот так.
> zfs snapshot pool/ФС@temp
> zfs send pool/ФС@temp | zfs recv pool/new-ФС
> zfs destroy pool/ФС@temp
> zfs destroy -r pool/ФС
> zfs rename pool/new-ФС pool/ФС
>
> Если команды выполнять ручками, то все работает нормально.
> Но усложнив задачу и заменив "zfs send pool/ФС@temp" на "zfs send -R 
> pool/ФС@temp", чтобы снапшоты (резервные копии) тоже передать,
> и запихнуть все в цикл, то случайным образом вываливается на команде 
> "zfs destroy -r" с сообщением "zfs cannot destroy ... dataset is busy".
> Если после этого вручную выполнить "zfs destroy -r pool/fs" - проблем нет.
Костыль, но может сработать:
(sleep 60 && zfs destroy -r pool/fs) &

> Интернет пока не помог в поиске решения :(
>
> Или может есть более правильный способ дефрагментации пула zfs? (но 
> без удаления снапшотов с резервными копиями)
>
> Спасибо.



More information about the freebsd mailing list