Сравнение дедупликации Windows 2012 R2, ZFS, BTRFS и SDFS на базе Ubuntu 16.04
К виртуальным машинам на базе Windows 2012 R2 и Ubuntu 16.04 прицеплены диски 50Gb.
В Windows 2012 R2 просто создан том и включена дедупликация.
В Ubuntu включаются различные варианты настроек файловых систем.
После этого тома заполняются одинаковым набором данных - архивы и дистрибутивы. То есть типичная файлопомойка.
На BTRFS дедупликация выполняется после записи данных с помощью duperemove.
Если отдельно не указано - на всех файловых системах используются дефолтные настройки.
Перед заполнением данными на ZFS включена дедупликация со сжатием:
zfs set compression=on zroot zfs set dedup=on zroot
sudo zfs get used,available,logicalused testdedup NAME PROPERTY VALUE SOURCE testdedup used 47.1G - testdedup available 4.65G - testdedup logicalused 47.0G - df -h Filesystem Size Used Avail Use% Mounted on testdedup 52G 47G 4.7G 91% /testdedup
sudo zfs get used,available,logicalused testdedup NAME PROPERTY VALUE SOURCE testdedup used 44.0G - testdedup available 6.96G - testdedup logicalused 46.4G - df -h Filesystem Size Used Avail Use% Mounted on testdedup 51G 44G 7.0G 87% /testdedup
sudo zfs set dedup=on testdedup sudo zfs set recordsize=4k testdedup
Производительность на запись упала очень сильно. С recordsize=4k ZFS как файлопомойка не эффективна.
sudo zfs set dedup=on testdedup sudo zfs set compress=on testdedup sudo zfs set recordsize=64k testdedup
Результат:
sudo zfs get used,available,logicalused,compressratio testdedup NAME PROPERTY VALUE SOURCE testdedup used 44.1G - testdedup available 6.85G - testdedup logicalused 46.4G - testdedup compressratio 1.05x - df -h Filesystem Size Used Avail Use% Mounted on testdedup 51G 44G 6.9G 87% /testdedup
Связка BTRFS + duperemove
sudo btrfs filesystem df -h /mnt Data, single: total=48.73GiB, used=43.96GiB System, single: total=4.00MiB, used=16.00KiB Metadata, single: total=264.00MiB, used=56.44MiB GlobalReserve, single: total=32.00MiB, used=0.00B df -h Filesystem Size Used Avail Use% Mounted on /dev/xvdb 50G 45G 5.8G 89% /mnt
BTRFS смонтирован с опцией compress-force, дедупликация выполнена duperemove.
sudo btrfs filesystem df -h /mnt System, single: total=4.00MiB, used=12.00KiB Data+Metadata, single: total=45.01GiB, used=40.50GiB GlobalReserve, single: total=512.00MiB, used=0.00B df -h Filesystem Size Used Avail Use% Mounted on /dev/xvdb 50G 42G 9.5G 82% /mnt
wget http://www.opendedup.org/downloads/sdfs-latest.deb sudo dpkg -i sdfs-latest.deb sudo apt-get -f install sudo su sudo mkfs.ext4 /dev/xvdb sudo mkdir --parents /opt/sdfs/ sudo mount /dev/xvdb /opt/sdfs/
Вот объем незанятного места:
df -h Filesystem Size Used Avail Use% Mounted on /dev/xvdb 50G 52M 47G 1% /opt/sdfs
Создаем том:
sudo mkfs.sdfs --volume-name=pool0 --volume-capacity=50GB sudo mount.sdfs pool0 /mnt
Настройки по-умолчанию получились такие:
io chunk-size="256" dedup-files="true" hash-type="VARIABLE_MURMUR3"
hash-type=“VARIABLE_MURMUR3” означает, что используется переменный размер блока для дедупликации, вычисляемый автоматически.
Вот результаты после заливки файлов:
df -h Filesystem Size Used Avail Use% Mounted on /dev/xvdb 50G 41G 6.2G 87% /opt/sdfs sdfs:/etc/sdfs/pool0-volume-cfg.xml:6442 51G 39G 12G 77% /mnt
И статистика по тому:
sdfscli --volume-info Files : 3578 Volume Capacity : 50 GB Volume Current Logical Size : 46.84 GB Volume Max Percentage Full : 95.0% Volume Duplicate Data Written : 8.76 GB Unique Blocks Stored: 38.3 GB Unique Blocks Stored after Compression : 38.4 GB Cluster Block Copies : 2 Volume Virtual Dedup Rate (Unique Blocks Stored/Current Size) : 18.22% Volume Actual Storage Savings (Compressed Unique Blocks Stored/Current Size) : 18.02% Compression Rate: -0.25%
Данные SDFS размещены на томе BTRFS, на котором включена компрессия zlib.
SDFS:
io chunk-size="256" dedup-files="true" hash-type="VARIABLE_MURMUR3"
df -h Filesystem Size Used Avail Use% Mounted on /dev/xvdb 50G 37G 13G 75% /opt/sdfs sdfs:/etc/sdfs/pool0-volume-cfg.xml:6442 51G 39G 12G 77% /mnt
sdfscli --volume-info Files : 3578 Volume Capacity : 50 GB Volume Current Logical Size : 46.84 GB Volume Max Percentage Full : 95.0% Volume Duplicate Data Written : 8.76 GB Unique Blocks Stored: 38.3 GB Unique Blocks Stored after Compression : 38.4 GB Cluster Block Copies : 2 Volume Virtual Dedup Rate (Unique Blocks Stored/Current Size) : 18.22% Volume Actual Storage Savings (Compressed Unique Blocks Stored/Current Size) : 18.02% Compression Rate: -0.25%
Производительность:
dd if=/dev/zero of=/mnt/TEST.ZERO bs=16384 1478190+0 records in 1478190+0 records out 24218664960 bytes (24 GB, 23 GiB) copied, 148.419 s, 163 MB/s Tasks: 586 total, 2 running, 584 sleeping, 0 stopped, 0 zombie %Cpu(s): 43.3 us, 34.3 sy, 0.0 ni, 21.8 id, 0.0 wa, 0.0 hi, 0.2 si, 0.4 st KiB Mem : 4037716 total, 2282464 free, 874880 used, 880372 buff/cache KiB Swap: 1171452 total, 1154028 free, 17424 used. 3067036 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 24084 root 20 0 3943336 768132 23104 S 141.4 19.0 4:29.02 jsvc 24251 root 20 0 7332 696 620 R 15.1 0.0 0:19.55 dd 24342 user 20 0 42348 4108 3132 R 0.7 0.1 0:00.09 top
sudo mkfs.sdfs --volume-name=pool0 --volume-capacity=50GB --chunk-store-compress=true --compress-metadata=true sudo mount.sdfs pool0 /mnt
После заливки файлов:
df -h Filesystem Size Used Avail Use% Mounted on /dev/xvdb 50G 38G 12G 77% /opt/sdfs sdfs:/etc/sdfs/pool0-volume-cfg.xml:6442 51G 37G 14G 74% /mnt sdfscli --volume-info Files : 3578 Volume Capacity : 50 GB Volume Current Logical Size : 46.84 GB Volume Max Percentage Full : 95.0% Volume Duplicate Data Written : 8.76 GB Unique Blocks Stored: 38.3 GB Unique Blocks Stored after Compression : 36.9 GB Cluster Block Copies : 2 Volume Virtual Dedup Rate (Unique Blocks Stored/Current Size) : 18.22% Volume Actual Storage Savings (Compressed Unique Blocks Stored/Current Size) : 21.21% Compression Rate: 3.65%
Производительность:
dd if=/dev/zero of=/mnt/TEST.ZERO bs=16384 497921+0 records in 497921+0 records out 8157937664 bytes (8.2 GB, 7.6 GiB) copied, 52.3913 s, 156 MB/s Tasks: 582 total, 2 running, 580 sleeping, 0 stopped, 0 zombie %Cpu(s): 47.4 us, 34.0 sy, 0.0 ni, 16.4 id, 0.0 wa, 0.0 hi, 0.0 si, 2.2 st KiB Mem : 4037716 total, 206404 free, 1101492 used, 2729820 buff/cache KiB Swap: 1171452 total, 1152020 free, 19432 used. 2839380 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 20824 root 20 0 4020188 1.226g 319568 S 151.3 31.8 20:51.12 jsvc 23450 root 20 0 7332 688 616 R 15.2 0.0 0:02.28 dd 23487 user 20 0 42348 3996 3020 R 0.3 0.1 0:00.07 top
После заливки файлов:
df -h Filesystem Size Used Avail Use% Mounted on /dev/xvdb 50G 41G 9.6G 81% /opt/sdfs sdfs:/etc/sdfs/pool0-volume-cfg.xml:6442 51G 39G 12G 77% /mnt sdfscli --volume-info Files : 3578 Volume Capacity : 50 GB Volume Current Logical Size : 46.84 GB Volume Max Percentage Full : 95.0% Volume Duplicate Data Written : 8.76 GB Unique Blocks Stored: 38.3 GB Unique Blocks Stored after Compression : 38.4 GB Cluster Block Copies : 2 Volume Virtual Dedup Rate (Unique Blocks Stored/Current Size) : 18.22% Volume Actual Storage Savings (Compressed Unique Blocks Stored/Current Size) : 18.02% Compression Rate: -0.25%
Производительность:
dd if=/dev/zero of=/mnt/TEST.ZERO bs=16384 401942+0 records in 401942+0 records out 6585417728 bytes (6.6 GB, 6.1 GiB) copied, 41.545 s, 159 MB/s Tasks: 581 total, 2 running, 579 sleeping, 0 stopped, 0 zombie %Cpu(s): 44.8 us, 35.8 sy, 0.0 ni, 18.9 id, 0.2 wa, 0.0 hi, 0.0 si, 0.3 st KiB Mem : 4037716 total, 119480 free, 2389112 used, 1529124 buff/cache KiB Swap: 1171452 total, 1157324 free, 14128 used. 1533060 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 3024 root 20 0 4008900 1.273g 320148 S 143.2 33.1 18:12.32 jsvc 5337 root 20 0 7332 704 632 R 14.9 0.0 0:03.98 dd 5345 user 20 0 42348 4052 2996 R 1.0 0.1 0:00.16 top
В то же время с тем же набором данных на NTFS:
PS C:\Windows\system32> Get-DedupStatus F: | fl Volume : F: VolumeId : \\?\Volume{69c27e73-82e4-4962-bce6-d83d0b7e0616}\ Capacity : 49.87 GB FreeSpace : 10.8 GB UsedSpace : 39.07 GB UnoptimizedSize : 48.35 GB SavedSpace : 9.28 GB SavingsRate : 19 % OptimizedFilesCount : 1967 OptimizedFilesSize : 47.69 GB OptimizedFilesSavingsRate : 19 % InPolicyFilesCount : 1967 InPolicyFilesSize : 47.69 GB LastOptimizationTime : 4/21/2017 10:45:09 AM LastOptimizationResult : 0x00000000 LastOptimizationResultMessage : The operation completed successfully. LastGarbageCollectionTime : 4/20/2017 4:44:56 PM LastGarbageCollectionResult : 0x00565302 LastGarbageCollectionResultMessage : There are no actions associated with this job. LastScrubbingTime : LastScrubbingResult : LastScrubbingResultMessage :
А вот результат, если применить к тому компрессию NTFS, а затем дедуплицировать данные:
PS C:\Windows\system32> Get-DedupStatus F: | fl Volume : F: VolumeId : \\?\Volume{69c27e73-82e4-4962-bce6-d83d0b7e0616}\ Capacity : 49.87 GB FreeSpace : 11.7 GB UsedSpace : 38.18 GB UnoptimizedSize : 47.45 GB SavedSpace : 9.28 GB SavingsRate : 19 % OptimizedFilesCount : 1963 OptimizedFilesSize : 46.82 GB OptimizedFilesSavingsRate : 19 % InPolicyFilesCount : 1963 InPolicyFilesSize : 46.82 GB LastOptimizationTime : 4/25/2017 9:26:35 AM LastOptimizationResult : 0x00000000 LastOptimizationResultMessage : The operation completed successfully.
Эффективность немного выше, чем без компрессии.
Эффективность дедупликации Windows 2012R2 существенно превышает эффективность дедупликации ZFS и BTRFS. На одинаковом наборе данных дедупликация Windows 2012R2 сохраняет больше места, чем ZFS и BTRFS, которые показывают примерно одинаковую эффективность дедупликации.
Конкурировать с дедупликацией Windows может только SDFS - http://www.opendedup.org. Значительно (по сравнениею с Windows 2012R2) сэкономить место позволила конфигурация в которой контейнер SDFS размещен на томе BTRFS. В Windows 2012R2 после размещения файлов осталось свободно около 11Gb, на томе BTRFS с контейнером SDFS осталось свободно около 13Gb.
Важно отметить, что Windows и BTRFS выполняют дедупликацию уже размещенных данных по расписанию, а ZFS и SDFS дедуплицирует данные в момент записи данных in-line. При этом, для нормальной работы дедупликации на ZFS система должна иметь много памяти. По разным оценкам - от 2Gb до 5Gb RAM на 1Tb данных - https://wiki.freebsd.org/ZFSTuningGuide. SDFS расходует память значительно экономичнее.
Даже на плохосжимаемых данных компрессия ZFS дает больший выигрыш, чем дедупликация, а уменьшение recordsize выигрыша в свободном пространстве не дает, но снижает производительность.
В результате лидером по количеству сэкономленного места, по моим наблюдениям, стала связка BTRFS compress-force=zlib + SDFS.