Пока делал все тесты и писал статью меня так и преследовало устойчивое выражение.
Когда коту делать нефиг, он яйца лижет.
Вот так и я.
![](https://habrastorage.org/getpro/habr/upload_files/e13/5fc/5a5/e135fc5a573f491f4555426eda2bc545.jpg)
Что имеем или наша лаба.
Для тестов я буду использовать Virtualbox 7.0.4 и установленные в ней виртуальные машины.
Host PC:
Intel Core i7-10510U CPU 1.80GHz / 2.30 GHz
4 CPU (8 CPU with HT)
32GB RAM
NVME Samsung SSD 970 EVO Plus 1TB
Windows Server 2022
2 vCPU
4GB RAM
Официальная документация по настройке deduplication доступна по ссылке:
https://learn.microsoft.com/en-us/windows-server/storage/data-deduplication/install-enable
Ubuntu Server 23.04 ZFS
2 vCPU
4GB RAM
Официальная документация по настройке ZFS deduplication доступна по ссылке:
https://ubuntu.com/tutorials/setup-zfs-storage-pool#1-overview
Ubuntu Server 23.04 BTRFS
2 vCPU
4GB RAM
Официальная документация по настройке BTRFS deduplication доступна по ссылкам:
https://btrfs.readthedocs.io/en/latest/Deduplication.html
https://github.com/Zygo/bees
Zabbix Appliance 6.4.3
2 vCPU
4GB RAM
Официальная документация доступна по ссылке:
https://www.zabbix.com/download_appliance
Размер датасета:
103.50 GB (111,144,359,353 bytes)
Внутри tar.gz архивы с бэкапами сайта.
![](https://habrastorage.org/getpro/habr/upload_files/ce0/95b/20d/ce095b20d950c891b6592fa279a5360a.jpg)
Для мониторинга и сборки метрик мы будем использовать Zabbix Appliance, поднятый там же в VirtualBox.
Все машины объединены в общую NAT network для удобства работы Zabbix и проброса портов в хост машину.
Для минимального влияния просадки производительности хост машины все тесты я проводил поочередно, то есть включенными одновременно были только VM Zabbix и текущая VM с тестом дедупликации, другие 2 VM были выключены.
Два слова про дедупликацию как таковую:
Дедупликация данных - это процесс удаления дубликатов данных в базе данных или файловой системе. Дедупликация может помочь уменьшить размер базы данных или занимаемое место на дисковом массиве.
Под дедупликацией может подразумеваться сканирование файлов в файловой системе или записей в БД с последующим удалением одинаковых значений с или без создания ссылок на оставшееся уникальное значение.
Мне же интересна реализация уменьшения размера занимаемого места на дисках путем дедуплицирования на уровне блоков файловой системы так, что для пользователя визуально ничего не меняется, как были видны файлы на диске так и остались на тех же местах, но вот вместо условных 10GB стали занимать 5Gb.
Понеслась:
Linux ZFS
Ставим нужные пакеты:
sudo apt install zfsutils-linux
Проверяем, что бинарники были установлены в наши каталоги
~$ whereis zfs
zfs: /usr/bin/zfs /usr/sbin/zfs /etc/zfs /usr/share/zfs
Теперь добавим 2 диска - для тестов я буду использовать RAID0 пул для экономии места на ПК, в реальном использовании я крайне не рекомендую использовать RAID0, особенно для критичных данных, наподобие резервных копий.
Краткая справка о том, почему RAID0 может быть опасен:
RAID 0 (Redundant Array of Independent Disks 0) - это метод объединения нескольких физических дисков в логический объем с целью повышения производительности. Данные разбиваются на блоки и параллельно записываются на все диски в массиве, что позволяет достичь более высокой скорости передачи данных.
Однако важно отметить, что RAID 0 не предоставляет отказоустойчивости. Поскольку данные не дублируются и не используется информация о четности, отказ одного из дисков в массиве приводит к недоступности всего RAID 0 и потере данных. Если один диск выходит из строя, все данные, распределенные по всем дискам, становятся непригодными к использованию.
Поэтому RAID 0 применяется тогда, когда главным является повышение производительности, а отказоустойчивость не является приоритетом. Он наиболее полезен для задач, требующих высоких скоростей передачи данных, таких как обработка больших файлов или видеомонтаж.
Важно помнить, что при использовании RAID 0 необходимо регулярно создавать резервные копии данных, так как отказ даже одного диска может привести к потере всех данных на массиве.
Прежде чем добавить диски в виртуальную машину нам нужно ее отключить.
sudo shutdown now
Я добавляю 2 диска по 60 GB (объем тестового датасета чуть больше 100GB)
![1.2.2 ZFS add disks to VM 1.2.2 ZFS add disks to VM](https://habrastorage.org/getpro/habr/upload_files/c8a/c93/034/c8ac930344f2eb5e55236ccbf5b9936d.jpg)
![1.2.2.1 ZFS add disks to VM 1.2.2.1 ZFS add disks to VM](https://habrastorage.org/getpro/habr/upload_files/c11/21a/361/c1121a361b897fffe9023288f094810a.jpg)
Вот что у нас должно получиться:
![1.2.3 ZFS add disks to VM 1.2.3 ZFS add disks to VM](https://habrastorage.org/getpro/habr/upload_files/419/b8e/fc4/419b8efc4e0db681be68991c6aa4c32e.jpg)
Включаем машину и проверяем, что добавленные диски видны в системе:
sudo fdisk -l
Мы должны увидеть следующий вывод:
Disk /dev/sdb: 60 GiB, 64424509440 bytes, 125829120 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/sdc: 60 GiB, 64424509440 bytes, 125829120 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Теперь создадим ZFS пул из 2х наших дисков.
sudo zpool create dedup-pool /dev/sdb /dev/sdc
Для создания RAID1 нужно также добавить keyword “mirror”, но для достижения нужного объема тогда потребуется N*2 количество дисков/места.
Какого-либо вывода мы не получим, но введя команду:
zpool list
Мы должны увидеть наш свежесозданный пул
~$ zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
dedup-pool 119G 110K 119G - - 0% 0% 1.00x ONLINE -
Так же мы можем проверить статус нашего пула командой:
sudo zpool status
Получаем вывод:
~$ sudo zpool status
pool: dedup-pool
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
dedup-pool ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
errors: No known data errors
Итак, ZFS пул мы создали, проверим, включена ли там дедупликация:
~$ sudo zfs get dedup dedup-pool
NAME PROPERTY VALUE SOURCE
dedup-pool dedup off default
По умолчанию дедупликация выключена, поэтому ее надо включить до перемещения данных на пул!
~$ sudo zfs set dedup=on dedup-pool
Немного о том, как работает дедупликация в ZFS:
ZFS выполняет дедупликацию на уровне блоков и не дедуплицирует данные, которые уже находятся на дисках.
Когда дедупликация в ZFS включена, она работает путем сравнения блоков данных, которые записываются на диск, с уже существующими блоками в таблице дедупликации. Если найдено совпадение, ZFS сохраняет ссылку на существующий блок вместо записи нового блока. Это позволяет снизить использование пространства хранения путем устранения избыточных блоков данных.
Однако ZFS не выполняет дедупликацию данных, которые уже присутствуют на дисках до включения дедупликации. Дедупликация применяется только к данным, записываемым в файловую систему после включения дедупликации. Это связано с тем, что выполнение дедупликации для уже существующих данных потребовало бы обширного и ресурсоемкого процесса сканирования и сравнения всех существующих блоков данных, что могло бы существенно повлиять на производительность.
Если вы хотите воспользоваться дедупликацией ZFS для существующих данных, то один из вариантов - скопировать данные на новую файловую систему ZFS с включенной дедупликацией, либо скопировать на временный диск и потом снова перенести в пул с включенной дедупликацией.
Так же есть интересная команда для просмотра назгрузки на пул и занятого места.
zpool iostat dedup-pool
~$ zpool iostat dedup-pool
capacity operations bandwidth
pool alloc free read write read write
---------- ----- ----- ----- ----- ----- -----
dedup-pool 110K 119G 0 0 32 2.09K
Закидывать датасет для дедупликации я буду используя возможности VirtualBox shared folders (не забудьте установить guest tools в VM до монтирования директории).
![1.5 ZFS Dataset folder mount 1.5 ZFS Dataset folder mount](https://habrastorage.org/getpro/habr/upload_files/57d/8c0/231/57d8c0231e12cc6bd0048ba933bd12e5.jpg)
Перезагружаем нашу VM и видим нужные нам директории:
$ cd /
$ ls | grep -i "ff_bak\|dedup"
dedup-pool
ff_bak
$ ls /dedup-pool/
$ sudo ls -la /ff_bak
total 221
drwxrwx--- 1 root vboxsf 131072 Jun 5 16:05 .
drwxr-xr-x 21 root root 4096 Jun 9 12:25 ..
drwxrwx--- 1 root vboxsf 0 Jun 5 16:04 20221116
drwxrwx--- 1 root vboxsf 0 Jun 5 16:04 20221119
…
Так же проверим размер содержимого чтобы знать как оно у нас сожмется:
$ sudo du -sh /ff_bak
104G /ff_bak
$ sudo du -s /ff_bak
108540471 /ff_bak
Копируем все содержимое из каталога /ff_bak
И сразу видим, как подскакивает нагрузка на диски
![1.5.2.1 ZFS sdb disk write rate 1.5.2.1 ZFS sdb disk write rate](https://habrastorage.org/getpro/habr/upload_files/57d/4e9/5e4/57d4e95e4fb81e3ab34f7e984db659fa.png)
![1.5.2.2 ZFS sdc disk write rate 1.5.2.2 ZFS sdc disk write rate](https://habrastorage.org/getpro/habr/upload_files/79b/95e/52c/79b95e52c85e0f0f973cb66230e2d3b7.png)
И так датасет скопирован, смотрим что у нас со статистикой zpool:
~$ zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
dedup-pool 119G 104G 15.4G - - 2% 87% 1.00x ONLINE -
Специально для тестирования деградации скорости копирования датасета я провел первое копирование на пул когда опция дедупликации была выключена:
Данные скопировались примерно за 18 минут, а вот с дедупликацией потребовалось уже около 30:
![1.6.0 ZFS sdc Disk utilization 1.6.0 ZFS sdc Disk utilization](https://habrastorage.org/getpro/habr/upload_files/0a8/dee/c0f/0a8deec0fb14cb31288fab08bbb476fc.png)
Так же посмотрим на процессор:
Процессору так же сложнее, он загружен операциями связанными с дедупликацией.
![1.6.1 ZFS CPU utilization full 1.6.1 ZFS CPU utilization full](https://habrastorage.org/getpro/habr/upload_files/379/c85/dc3/379c85dc3f5500c96ba6c9966d23433f.png)
По оперативной памяти особой разницы нет, у нас довольно небольшой датасет, на графике видны небольшие подергивания когда работает система дедупликации, но на этом все отличия заканчиваются.
![1.6.2 ZFS Memory utilization full 1.6.2 ZFS Memory utilization full](https://habrastorage.org/getpro/habr/upload_files/efc/2a1/5af/efc2a15afa85db3ae9adc961308fd9b4.png)
Но вот где те самые отличия, ради которых все затевалось:
df -h показывает странную картину, ему явно неизвестно про то, как показывать дедуплицированный диск
$ df -h
Filesystem Size Used Avail Use% Mounted on
dedup-pool 189G 104G 85G 56% /dedup-pool
А вот zpool list уже показывает корректные данные:
Мы видим, что реально занято около 33 Gb дискового пространства, коэффициент дедупликации 3.39!
$ zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
dedup-pool 119G 30.6G 88.4G - - 1% 25% 3.39x ONLINE -
Забавно, что в Zabbix мы видим картину похожую на df -h, с другой стороны, с чего бы ей быть другой.
![1.6.3 ZFS Used space 1.6.3 ZFS Used space](https://habrastorage.org/getpro/habr/upload_files/aeb/1ea/a10/aeb1eaa108a067ece1c4d9dd28ee6547.png)
Но в процентах картина ближе к правде, хотя тоже врет:
![1.6.4 ZFS Used space percent 1.6.4 ZFS Used space percent](https://habrastorage.org/getpro/habr/upload_files/8e9/535/006/8e9535006edb4168b8eda9d5781d810b.png)
Итого дедупликация на zpool дала нам следующую статистику:
Было занято 103.5 GB, стало 30.6G.
Коэффициент дедупликации: 3.39 !!!
Инфографика не вошедшая в текст:
![1.7.1 ZFS sdb disk write rate full 1.7.1 ZFS sdb disk write rate full](https://habrastorage.org/getpro/habr/upload_files/1e6/672/4b8/1e66724b8ba8c29ba0d85eb87f3e47bb.png)
![1.7.2 ZFS sdc disk write rate full 1.7.2 ZFS sdc disk write rate full](https://habrastorage.org/getpro/habr/upload_files/0a0/afe/8a8/0a0afe8a80fbce381df47768030d8fb0.png)
Выводы.
ZFS действительно может неплохо сэкономить место на дисках, вопрос конечно что дешевле - оператива или hdd, ну и тип данных, который мы собираемся там “хоронить” и дедуплицировать.
В целом оно работает и даже за вполне приемлемое время.
Имхо в качестве secondary non production backup storage подойдет, как некий домашний аналог Amazon S3 Glacier.
Плюсы и минусы.
Плюсы:
zpool легко настраивается.
Нет каких-либо лицензионных отчислений и платных фич.
Экономит огромное количество места на дисках, особенно если данные однотипные.
Минусы:
Сжимаются данные, которые будут записаны в zpool только после включения дедупликации.
Требуется огромное количество RAM, так как zfs и online deduplication очень требовательны к объемам оперативной памяти - на 1TB сжимаемого объема данных рекомендуется уже 5GB RAM и более (хорошая статья на тему https://constantin.glez.de/2011/07/27/zfs-to-dedupe-or-not-dedupe/).
Производительность записи на диски существенно снижается.
И самое главное - снижается надежность хранения данных (поврежденную файловую систему практически невозможно восстановить).
Linux BTRFS
BTRFS - позволяет нам использовать дедупликацию на одном томе, без необходимости собирать пул из нескольких дисков.
Добавляем один диск в систему объемом 120GB.
![2.1.1 BTRFS add disks to VM 2.1.1 BTRFS add disks to VM](https://habrastorage.org/getpro/habr/upload_files/798/552/578/79855257869070bd8cda9910aa9d65da.jpg)
![2.1.2 BTRFS add disks to VM.jpg 2.1.2 BTRFS add disks to VM.jpg](https://habrastorage.org/getpro/habr/upload_files/9a9/107/5f2/9a91075f2d0b5e36bd0a5fb60a50aec6.jpg)
Включаем машину и проверяем, что диск виден в системе:
~$ sudo fdisk -l
Disk /dev/sdb: 120 GiB, 128849018880 bytes, 251658240 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Теперь необходимо создать на новом диске файловую систему, делаем это командой:
~$ sudo mkfs.btrfs /dev/sdb -L btrfs_disk
Получаем вывод с информацией о нашей файловой системе:
Скопируем к себе UUID, он нам еще пригодится.
STDOUT:
btrfs-progs v6.2
See http://btrfs.wiki.kernel.org for more information.
NOTE: several default settings have changed in version 5.15, please make sure
this does not affect your deployments:
- DUP for metadata (-m dup)
- enabled no-holes (-O no-holes)
- enabled free-space-tree (-R free-space-tree)
Label: btrfs_disk
UUID: 22b5c24c-621f-4f19-aa27-8a756adde9c7
Node size: 16384
Sector size: 4096
Filesystem size: 120.00GiB
Block group profiles:
Data: single 8.00MiB
Metadata: DUP 1.00GiB
System: DUP 8.00MiB
SSD detected: no
Zoned device: no
Incompat features: extref, skinny-metadata, no-holes
Runtime features: free-space-tree
Checksum: crc32c
Number of devices: 1
Devices:
ID SIZE PATH
1 120.00GiB /dev/sdb
Если по какой-то причине UUID скопировать не удалось, то его можно будет узнать командой:
$ sudo blkid /dev/sdb
/dev/sdb: LABEL="btrfs_disk" UUID="22b5c24c-621f-4f19-aa27-8a756adde9c7" UUID_SUB="48d82394-3fa4-4215-98d6-2b389bc4444b" BLOCK_SIZE="4096" TYPE="btrfs"
Создаем директорию и маунтим в нее нашу btrfs.
~$ sudo mkdir /mnt/btrfs_disk
~$ sudo mount /dev/sdb /mnt/btrfs_disk
И сразу добавляем нашу файловую систему в fstab для автоматического mount:
~$ sudo vi /etc/fstab
Последней строкой добавляем:
/dev/disk/by-uuid/22b5c24c-621f-4f19-aa27-8a756adde9c7 /mnt/btrfs_disk btrfs defaults 0 0
![Нельзя просто так взять и выйти из Vim Нельзя просто так взять и выйти из Vim](https://habrastorage.org/getpro/habr/upload_files/3a6/f4f/c2d/3a6f4fc2d892e025ba22d2168cf98768.jpg)
Можно
Сохраняем и выходим из файла:
:wq enter
Можем сразу же применить наш файлик fstab командой:
sudo mount -a
Теперь нам нужно установить утилиту для дедупликации, BTRFS как бы поддерживает дедупликацию, но не реализует функционал из коробки.
Есть несколько вариантов, но я остановился на BEES, так как хотел проверить именно filesystem block-level deduplication.
Установка зависимостей и сборка из сорсов:
$ cd /tmp
$ sudo apt -y install git build-essential btrfs-progs markdown uuid-runtime
$ git clone https://github.com/Zygo/bees.git
$ cd ./bees && sudo make install
Далее нам необходимо поправить конфигурационный файл:
Копируем шаблон:
$ sudo cp /etc/bees/beesd.conf.sample /etc/bees/beesd.conf
Раскомментируем две строки, 9 и 34.
$ sudo vi /etc/bees/beesd.conf
Пример моего файла конфигурации:
1 ## Config for Bees: /etc/bees/beesd.conf.sample
2 ## https://github.com/Zygo/bees
3 ## It's a default values, change it, if needed
4
5 # How to use?
6 # Copy this file to a new file name and adjust the UUID below
7
8 # Which FS will be used
9 UUID=22b5c24c-621f-4f19-aa27-8a756adde9c7
10
11 ## System Vars
12 # Change carefully
13 # WORK_DIR=/run/bees/
14 # MNT_DIR="$WORK_DIR/mnt/$UUID"
15 # BEESHOME="$MNT_DIR/.beeshome"
16 # BEESSTATUS="$WORK_DIR/$UUID.status"
17
18 ## Options to apply, see `beesd --help` for details
19 # OPTIONS="--strip-paths --no-timestamps"
20
21 ## Bees DB size
22 # Hash Table Sizing
23 # sHash table entries are 16 bytes each
24 # (64-bit hash, 52-bit block number, and some metadata bits)
25 # Each entry represents a minimum of 4K on disk.
26 # unique data size hash table size average dedupe block size
27 # 1TB 4GB 4K
28 # 1TB 1GB 16K
29 # 1TB 256MB 64K
30 # 1TB 16MB 1024K
31 # 64TB 1GB 1024K
32 #
33 # Size MUST be multiple of 128KB
34 DB_SIZE=$((1024*1024*1024)) # 1G in bytes
Теперь нужно скопировать датасет из host машины на наш том BTRFS.
Для этого воспользуемся возможностями VirtualBox guest tools - подключим директорию с файлами к нашей VM (не забудьте установить guest tools в VM до монтирования директории).
![2.5 BTRFS Dataset folder mount 2.5 BTRFS Dataset folder mount](https://habrastorage.org/getpro/habr/upload_files/c3b/142/f12/c3b142f12bbe0700b69d36e5ef062bbd.jpg)
Копируем файлы:
$ sudo cp -R /ff_bak/ /mnt/btrfs_disk/
Посмотрим статистику по файловой системе:
$ sudo btrfs filesystem df /mnt/btrfs_disk
Data, single: total=105.00GiB, used=103.51GiB
System, DUP: total=8.00MiB, used=16.00KiB
Metadata, DUP: total=1.00GiB, used=113.28MiB
GlobalReserve, single: total=112.08MiB, used=0.00B
И чуть детальнее:
$ sudo btrfs fi usage /mnt/btrfs_disk
Overall:
Device size: 120.00GiB
Device allocated: 107.02GiB
Device unallocated: 12.98GiB
Device missing: 0.00B
Device slack: 0.00B
Used: 103.73GiB
Free (estimated): 14.47GiB (min: 7.98GiB)
Free (statfs, df): 14.47GiB
Data ratio: 1.00
Metadata ratio: 2.00
Global reserve: 112.08MiB (used: 0.00B)
Multiple profiles: no
Data,single: Size:105.00GiB, Used:103.51GiB (98.58%)
/dev/sdb 105.00GiB
Metadata,DUP: Size:1.00GiB, Used:113.28MiB (11.06%)
/dev/sdb 2.00GiB
System,DUP: Size:8.00MiB, Used:16.00KiB (0.20%)
/dev/sdb 16.00MiB
Unallocated:
/dev/sdb 12.98GiB
Как видим занято 103.73GiB
Каких-либо других откровений у нас там не будет, но для дальнейшего референса интересно посмотреть, как система выглядела “ДО”.
Запускаем выполнение bees командой “beesd UUID”.
Данная команда запускает интерактивный режим. Для маленького теста подойдет, но для реального использования лучше запускать в screen или создать системный сервис.
$ sudo beesd 22b5c24c-621f-4f19-aa27-8a756adde9c7
Создание системного сервиса для работы bees в фоне (для теста не требуется):
$ sudo vi /etc/systemd/system/beesd-22b5c24c-621f-4f19-aa27-8a756adde9c7.service
###################################################
[Unit]
Description=Deduplication service for sdb with specific UUID
[Service]
User=root
WorkingDirectory=/usr/sbin
ExecStart=/usr/sbin/beesd 22b5c24c-621f-4f19-aa27-8a756adde9c7
[Install]
WantedBy=multi-user.target
###################################################
$ systemctl daemon-reload
$ sudo systemctl start beesd-22b5c24c-621f-4f19-aa27-8a756adde9c7.service
$ sudo systemctl status --no-pager --full beesd-22b5c24c-621f-4f19-aa27-8a756adde9c7.service
###################################################
● beesd-b5f0aeba-7fc7-4ffa-958e-0c1f42adde70.service - Deduplication service for sdb with specific UUID
Loaded: loaded (/etc/systemd/system/beesd-b5f0aeba-7fc7-4ffa-958e-0c1f42adde70.service; enabled; preset: enabled)
Active: active (running) since Tue 2023-06-13 08:20:24 +07; 2h 8min ago
Main PID: 545 (bees)
Tasks: 9 (limit: 4518)
Memory: 1.0G
CPU: 10.977s
CGroup: /system.slice/beesd-b5f0aeba-7fc7-4ffa-958e-0c1f42adde70.service
└─545 /usr/lib/bees/bees /run/bees/mnt/b5f0aeba-7fc7-4ffa-958e-0c1f42adde70
Jun 13 08:23:26 home-ubuntu beesd[545]: 2023-06-13 08:23:26 545.622<7> crawl_transid: Clearing open FD cache with size 1 to enable file delete
Jun 13 08:23:26 home-ubuntu beesd[545]: 2023-06-13 08:23:26 545.622<7> crawl_transid: Clearing resolve cache with size 0
Jun 13 08:23:26 home-ubuntu beesd[545]: 2023-06-13 08:23:26 545.622<7> crawl_transid: Polling 59.9353s for next transid RateEstimator { count = 1023, raw = 2.9701 / 178.014, ratio = 2.9701 / 178.014, rate = 0.0166846, duration(1) = 59.9355, seconds_for(1) = 59.9353 }
Jun 13 08:23:26 home-ubuntu beesd[545]: 2023-06-13 08:23:26 545.617<6> crawl_new: Crawl started BeesCrawlState 5:0 offset 0x0 transid 1022..1023 started 2023-06-13-08-23-26 (0s ago)
Jun 13 08:23:26 home-ubuntu beesd[545]: 2023-06-13 08:23:26 545.617<6> crawl_new: Crawl finished BeesCrawlState 5:0 offset 0x0 transid 1022..1023 started 2023-06-13-08-23-26 (0s ago)
Jun 13 08:23:26 home-ubuntu beesd[545]: 2023-06-13 08:23:26 545.617<6> crawl_new: Crawl started BeesCrawlState 256:0 offset 0x0 transid 1022..1023 started 2023-06-13-08-23-26 (0s ago)
Jun 13 08:23:26 home-ubuntu beesd[545]: 2023-06-13 08:23:26 545.617<6> crawl_more: Crawl finished BeesCrawlState 256:258 offset 0xffffffffffff0000 transid 1022..1023 started 2023-06-13-08-23-26 (0s ago)
Jun 13 08:23:26 home-ubuntu beesd[545]: 2023-06-13 08:23:26 545.617<6> crawl_more: crawl_more ran out of data after 59.9351s
###################################################
$ systemctl enable --now beesd@22b5c24c-621f-4f19-aa27-8a756adde9c7.service
Наблюдать за ходом выполнения можно командой:
watch -n5 sudo btrfs fi usage /mnt/btrfs_disk
STDOUT:
Every 5.0s: sudo btrfs fi usage /mnt/btrfs_disk home-ubuntu: Mon Jun 12 04:23:55 2023
Overall:
Device size: 120.00GiB
Device allocated: 96.02GiB
Device unallocated: 23.98GiB
Device missing: 0.00B
Device slack: 0.00B
Used: 76.05GiB
Free (estimated): 42.10GiB (min: 30.11GiB)
Free (statfs, df): 42.10GiB
Data ratio: 1.00
Metadata ratio: 2.00
Global reserve: 116.25MiB (used: 0.00B)
Multiple profiles: no
Data,single: Size:94.00GiB, Used:75.88GiB (80.73%)
/dev/sdb 94.00GiB
Metadata,DUP: Size:1.00GiB, Used:87.27MiB (8.52%)
/dev/sdb 2.00GiB
System,DUP: Size:8.00MiB, Used:16.00KiB (0.20%)
/dev/sdb 16.00MiB
Unallocated:
/dev/sdb 23.98GiB
Как видим процесс пошел, место освобождается.
Идем пить кофе.
По окончании работы beesd в логе будет сообщение (при запуске в скрине или интерактивно):
2023-06-13 10:00:33 13602.13625<6> crawl_more: crawl_more ran out of data after 7461.16s
Результаты:
$ sudo btrfs fi usage /mnt/btrfs_disk
Overall:
Device size: 120.00GiB
Device allocated: 108.02GiB
Device unallocated: 11.98GiB
Device missing: 0.00B
Device slack: 0.00B
Used: 82.30GiB
Free (estimated): 35.88GiB (min: 29.89GiB)
Free (statfs, df): 35.87GiB
Data ratio: 1.00
Metadata ratio: 2.00
Global reserve: 97.64MiB (used: 0.00B)
Multiple profiles: no
Data,single: Size:106.01GiB, Used:82.11GiB (77.46%)
/dev/sdb 106.01GiB
Metadata,DUP: Size:1.00GiB, Used:100.41MiB (9.81%)
/dev/sdb 2.00GiB
System,DUP: Size:8.00MiB, Used:16.00KiB (0.20%)
/dev/sdb 16.00MiB
Unallocated:
/dev/sdb 11.98GiB
Весь процесс занял более 7 часов!
До дедупликации было занято 103.73GiB, после 82.30GiB, результат дедупликации всего лишь ~20.66%, учитывая, как долго проходил процесс, как-то негусто.
Инфографика:
![2.7.1 BTRFS CPU utilization full 2.7.1 BTRFS CPU utilization full](https://habrastorage.org/getpro/habr/upload_files/60e/e4c/faf/60ee4cfafb34bc257788eb3be9059f75.png)
![2.7.2 BTRFS Memory utilization full 2.7.2 BTRFS Memory utilization full](https://habrastorage.org/getpro/habr/upload_files/c25/0b1/588/c250b15880f47601771e9520fb72b132.png)
![2.7.3 BTRFS Disk utilization full 2.7.3 BTRFS Disk utilization full](https://habrastorage.org/getpro/habr/upload_files/4cb/980/71c/4cb98071cffac935eb90921765d249a7.png)
![2.7.4 BTRFS Disk write rate full 2.7.4 BTRFS Disk write rate full](https://habrastorage.org/getpro/habr/upload_files/266/0a7/074/2660a7074502a19dc5526ee90ef6ae6e.png)
![2.7.5 BTRFS Space utilization full 2.7.5 BTRFS Space utilization full](https://habrastorage.org/getpro/habr/upload_files/550/7be/5d0/5507be5d0df38393bfd30a4a513889c2.png)
Выводы:
На мой взгляд дедупликация в связке BTRFS с BEES оказалась не так интересна и эффективна, как на ZFS. Да, у них разные принципы, но конечный результат на ZFS как-то поинтереснее и достигается за более короткое время.
С другой стороны BTRFS как видим по метрикам не так требовательна к RAM, хотя при таких результатах сжатия объема лично для меня это уже не так важно.
Плюсы и минусы.
Плюсы:
Сжимает данные, которые уже были записаны на диск.
Нет каких-либо лицензионных отчислений и платных фич.
Экономит некоторое количество места на дисках, особенно если данные однотипные.
Не требовательна к RAM.
Минусы:
BTRFS дедупликация не совсем простая в настройке.
Очень требовательна к CPU, процесс дедупликации намного дольше чем на ZFS.
Производительность системы в целом снижается в разы во время дедупликации, можно поиграться настройками beesd, но тогда сам процесс дедупликации может стать крайне долгим.
Снижает надежность данных (поврежденную файловую систему практически не возможно восстановить).
Windows NTFS
Дедупликация в Windows работает к сожалению только на файловом уровне, но довольно хитро. Подробнее можно прочитать тут: https://learn.microsoft.com/en-us/windows-server/storage/data-deduplication/understand
Для того чтобы воспользоваться дедупликацией нам потребуется установить компоненты Windows Fileserver, сделать это можно через Server Manager:
![3.1 NTFS Server components 3.1 NTFS Server components](https://habrastorage.org/getpro/habr/upload_files/70e/232/c39/70e232c397dbb4cda10d7a5f7e52f489.jpg)
Далее нам необходимо добавить диск для датасета.
Выключаем VM.
Добавляем диск.
![3.2.2.1 NTFS add disk 3.2.2.1 NTFS add disk](https://habrastorage.org/getpro/habr/upload_files/38f/2dc/142/38f2dc1420175c20a4acffff23f520bb.jpg)
![3.2.2.2 NTFS add disk 3.2.2.2 NTFS add disk](https://habrastorage.org/getpro/habr/upload_files/f61/de0/a4d/f61de0a4db44bd78e942d25b31aee9e3.jpg)
Теперь нужно добавить диск в самой системе, включаем VM и открываем мастер управления дисками:
![3.2.3.1 NTFS disk management 3.2.3.1 NTFS disk management](https://habrastorage.org/getpro/habr/upload_files/95c/c22/687/95cc22687e1e7a3647d8687cc3c4d6e0.jpg)
Нас сразу встретит мастер разметки новой партиции:
Для диска с дедупликацией какой-либо разницы в разметке MBR или GPT нет, поэтому я выбрал GPT, как более современную и надежную разметку.
Из описания:
GPT (GUID Partition Table) включает в себя избыточность, храня несколько копий таблицы разделов на всем диске, что снижает риск потери данных из-за повреждения таблицы разделов.
![3.2.4 NTFS GPT partition 3.2.4 NTFS GPT partition](https://habrastorage.org/getpro/habr/upload_files/a72/1ed/2b5/a721ed2b5c261ce6ec847810c75cae36.jpg)
В отличии от разметки, тип файловой системы для дедупликации очень важен, так как Windows Server реализует дедупликацию только на NTFS файловых системах (в документации есть описание что начиная с версии Windows Server 2019 дедупликация теперь поддерживается и на ReFS, протестирую это в следующий раз), создаем раздел и форматируем его в NTFS:
![3.2.5 NTFS Format partition 3.2.5 NTFS Format partition](https://habrastorage.org/getpro/habr/upload_files/75a/c60/adc/75ac60adcecb388540d24ba1fbb2f599.jpg)
Раздел готов, теперь необходимо включить на нем дедупликацию.
В отличии от ZFS, Windows делает offline дедупликацию, а значит ему все равно включим мы дедупликацию до или после помещения данных на том.
Предлагаю включить ее сейчас.
Идем в Server Manager и настраиваем дедупликацию на диске:
![3.2.7.1 NTFS Setup Dedup 3.2.7.1 NTFS Setup Dedup](https://habrastorage.org/getpro/habr/upload_files/a2d/af7/76c/a2daf776cdc6f40d07c1cc150b9685f6.jpg)
![3.2.7.2 NTFS Dedup Shedule 3.2.7.2 NTFS Dedup Shedule](https://habrastorage.org/getpro/habr/upload_files/5b3/034/a2a/5b3034a2af234bfef6a5cb0fef53b17b.jpg)
Так как дедупликация сильно снижает производительность системы в целом, в настройках предусмотрены многочисленные опции для настройки расписания и исключений из дедупликации.
Для нашего теста я поставлю 0 дней и уберу расписание оптимизации нагрузки.
Закидывать датасет для дедупликации я буду используя возможности VirtualBox shared folders.
![3.2.8.1 NTFS Shared folder 3.2.8.1 NTFS Shared folder](https://habrastorage.org/getpro/habr/upload_files/057/51a/596/05751a596e663fbd73067f2a14197b6c.jpg)
Практически сразу в системе мы увидим “сетевой диск”:
![3.2.8.2 NTFS NetworkShare 3.2.8.2 NTFS NetworkShare](https://habrastorage.org/getpro/habr/upload_files/a7b/8a7/504/a7b8a7504a3b2e605ab12ab18d2b8e0b.jpg)
Копируем датасет на наш диск с дедупликацией:
![3.2.9 NTFS Copy files 3.2.9 NTFS Copy files](https://habrastorage.org/getpro/habr/upload_files/eec/a04/917/eeca0491725c6d8538071eb5c28ea749.jpg)
Пока копируются файлы можно воспользоваться PS и посмотреть статус дедупликации:
PS C:\Windows\system32> Get-DedupStatus
FreeSpace SavedSpace OptimizedFiles InPolicyFiles Volume
--------- ---------- -------------- ------------- ------
94.94 GB 0 B 0 0 E:
PS C:\Windows\system32> Get-DedupVolume -Volume E:
Enabled UsageType SavedSpace SavingsRate Volume
------- --------- ---------- ----------- ------
True Default 0 B 0 % E:
PS C:\Windows\system32> Get-DedupProperties -DriveLetter E
InPolicyFilesCount : 0
InPolicyFilesSize : 0
OptimizedFilesCount : 0
OptimizedFilesSavingsRate : 0
OptimizedFilesSize : 0
SavingsRate : 0
SavingsSize : 0
UnoptimizedSize : 56822681600
PSComputerName :
Как мы видим пока что ничего не происходит.
Но мы можем “попросить” систему начать оптимизацию данных.
Выведем информацию о дедупликации по завершении копирования всех файлов:
PS C:\Windows\system32> Get-DedupStatus
FreeSpace SavedSpace OptimizedFiles InPolicyFiles Volume
--------- ---------- -------------- ------------- ------
16.38 GB 0 B 0 0 E:
PS C:\Windows\system32> Get-DedupVolume -Volume E:
Enabled UsageType SavedSpace SavingsRate Volume
------- --------- ---------- ----------- ------
True Default 0 B 0 % E:
PS C:\Windows\system32> Get-DedupProperties -DriveLetter E
InPolicyFilesCount : 0
InPolicyFilesSize : 0
OptimizedFilesCount : 0
OptimizedFilesSavingsRate : 0
OptimizedFilesSize : 0
SavingsRate : 0
SavingsSize : 0
UnoptimizedSize : 111247380480
PSComputerName :
Также можно посмотреть статус Volume в UI:
![3.2.11 3.2.11](https://habrastorage.org/getpro/habr/upload_files/c3d/f49/869/c3df4986976047ce431bacae8e7599f5.jpg)
Теперь запустим процесс дедупликации, чтобы не ждать когда система сама запустит его:
Start-DedupJob -Volume E: -Type Optimization
Type ScheduleType StartTime Progress State Volume
---- ------------ --------- -------- ----- ------
Optimization Manual 0 % Queued E:
Можно идти пить чай.
Итак результаты:
PS C:\Windows\system32> Get-DedupStatus
FreeSpace SavedSpace OptimizedFiles InPolicyFiles Volume
--------- ---------- -------------- ------------- ------
112.85 GB 98.11 GB 377 377 E:
PS C:\Windows\system32> Get-DedupVolume -Volume E:
Enabled UsageType SavedSpace SavingsRate Volume
------- --------- ---------- ----------- ------
True Default 98.11 GB 93 % E:
PS C:\Windows\system32> Get-DedupProperties -DriveLetter E
InPolicyFilesCount : 377
InPolicyFilesSize : 111144308918
OptimizedFilesCount : 377
OptimizedFilesSavingsRate : 94
OptimizedFilesSize : 111144308918
SavingsRate : 93
SavingsSize : 105341122774
UnoptimizedSize : 112999258326
PSComputerName :
![3.2.13 NTFS disk after dedup 3.2.13 NTFS disk after dedup](https://habrastorage.org/getpro/habr/upload_files/e5a/700/f3c/e5a700f3c6d2e5b0e5b7418fd082f143.jpg)
Сжатие размера аж на 93%!
Занимаемое место на диске 7.13GB (вместо 103.5 GB)
Инфографика:
![3.3.1 NTFS CPU utilization 3.3.1 NTFS CPU utilization](https://habrastorage.org/getpro/habr/upload_files/9b1/118/c2e/9b1118c2e59dbce09e16ce44a54250fc.png)
Вот тут было неожиданно для меня - дедупликация потребовала меньше RAM чем копирование файлов.
![3.3.2 NTFS RAM utilization 3.3.2 NTFS RAM utilization](https://habrastorage.org/getpro/habr/upload_files/756/7bb/406/7567bb406180da1c7a9e1f2d72047e1c.png)
![3.3.3 NTFS Avg Queue 3.3.3 NTFS Avg Queue](https://habrastorage.org/getpro/habr/upload_files/c1b/001/cb2/c1b001cb2f0071b664c096a07b8c8029.png)
![3.3.4 NTFS Disk write rate 3.3.4 NTFS Disk write rate](https://habrastorage.org/getpro/habr/upload_files/46f/fb5/64b/46ffb564bfaf4c5a2303768946d9c0d8.png)
Выводы:
Под мой датасет винда оказалась крайне эффективна, о таком коэффициенте сжатия данных можно было только мечтать!
Ах если бы не проприетарность и прочие ограничения и нюансы Майкрософт, но нет, дедупликация от MS доступна только на Windows Server.
Плюсы и минусы:
Плюсы:
Сжимает данные, которые уже были записаны на диск.
Экономит огромное количество места на дисках, особенно если данные однотипные.
Не требовательна к RAM.
Минусы:
Функционал доступен только в платных серверных версиях Windows Server.
Снижается надежность хранения данных (поврежденную файловую систему практически невозможно восстановить)
Производительность системы несколько снижается при больших объемах.
До данного тестирования я много раз пробовал погрузиться в различные реализации дедупликации данных - конечно же хотелось показать поганому Майкрософту силушку Linux ZFS, BTRFS, но, как мы видим, в этот раз Microsoft таки и правда удивил, без какого-либо стеба (где мой чемодан деняг, вносите).
Также постфактум хочу отметить, что данную статью можно бесконечно много расширять - попробовать другие реализации дедупликации BTRFS, либо протестировать дедупликацию меняя множество настроек ZFS, вероятно можно также попробовать другой формат архивов с данными датасета, мне же хотелось найти максимально доступный вариант, не требующий многомесячных тестирований и подбора настроек под разные типы данных.
Собственно, если у вас есть опыт использования других систем дедупликации на базе linux, то я буду благодарен за советы и комментарии к данной статье!
Холивары и срач можно туда же ;)
И напоследок - был у меня когда-то сервер на котором со временем накопился очень неплохой датасет (сжатие 98%, вместо 5.52TB занято чуть больше 100GB):
![](https://habrastorage.org/getpro/habr/upload_files/f47/8e6/ca0/f478e6ca0a0c1dde8b907533914bd0a8.jpg)
Файловая система | Объем до дедупликации | Объем после дедупликации | Коэффициент дедупликации |
ZFS | 103.5 GB | 30.6 GB | 3.39 |
BTRFS | 103.5 GB | 82.30 GiB | 1.26 |
NTFS | 103.5 GB | 7.13 GB | 14.51 |