Sim, o ZFS alocará espaço extra para o mesmo arquivo se um instantâneo for tirado do conjunto de arquivos.
Primeiro, vamos criar um conjunto de arquivos vazio e preparar um arquivo para copiar. Por razões de simplicidade, compressão foi desativada e o pool foi criado em um único disco sem qualquer raidz ou espelho .
[root@localhost ~]# dd if=/dev/urandom of=/tmp/testfile bs=16M count=1
1+0 records in
1+0 records out
16777216 bytes (17 MB) copied, 0.113345 s, 148 MB/s
[root@localhost ~]# zpool create tank sdd
[root@localhost ~]# zfs create tank/test
O espaço usado no disco pode ser visto com zpool list
.
[root@localhost]# zpool list tank
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
tank 9.94G 182K 9.94G - 0% 0% 1.00x ONLINE -
Agora copie o arquivo para o conjunto de arquivos do ZFS, crie um instantâneo e examine o espaço usado.
[root@localhost ~]# /bin/cp /tmp/testfile /tank/test/
[root@localhost ~]# zfs list -t all -r tank/test
NAME USED AVAIL REFER MOUNTPOINT
tank/test 16.0M 9.61G 16.0M /tank/test
[root@localhost ~]# zfs snapshot tank/test@1
[root@localhost ~]# zfs list -t all -r tank/test
NAME USED AVAIL REFER MOUNTPOINT
tank/test 16.0M 9.61G 16.0M /tank/test
tank/test@1 0B - 16.0M -
Ok, copie o mesmo arquivo novamente para o mesmo local no conjunto de arquivos do ZFS e observe o espaço usado novamente.
[root@localhost ~]# /bin/cp -f /tmp/testfile /tank/test/
[root@localhost ~]# zfs list -t all -r tank/test
NAME USED AVAIL REFER MOUNTPOINT
tank/test 32.0M 9.60G 16.0M /tank/test
tank/test@1 16.0M - 16.0M -
Além disso, o espaço em disco usado no pool está crescendo para 32 MB.
[root@localhost tank]# zpool list tank
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
tank 9.94G 32.2M 9.91G - 0% 0% 1.00x ONLINE -
Como você pode ver, o tank/test
fileset agora é responsável por 32 MB no total, dividindo em 16 MB no tank/test
fileset e 16 MB no tank/test@1
snapshot. Além disso, a saída de zpool list
mostra uma alocação de 32 MB no disco.
Se você repetir copiar e tirar uma foto instantânea , o tank/test
total USED aumentará ainda mais.
Atualizar
Obrigado @Andrew Henle por perguntar. Tive que atualizar minha resposta acima e continuaremos com as coisas deduplicação abaixo.
Vamos fazer isso novamente com um conjunto de arquivos que tenha desduplicação ativado.
[root@localhost]# zfs destroy -r tank/test
[root@localhost]# zfs create tank/test-dedup
[root@localhost]# zfs set dedup=on tank/test-dedup
Vou pular as únicas etapas aqui e apenas adicionarei a saída da visão geral do espaço usado.
[root@localhost ~]# zfs list -t all -r tank/test-dedup
NAME USED AVAIL REFER MOUNTPOINT
tank 32.3M 9.61G 24K /tank
tank/test-dedup 32.1M 9.61G 16.0M /tank/test-dedup
tank/test-dedup@1 16.0M - 16.0M -
[root@localhost ~]# zpool list tank
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
tank 9.94G 16.3M 9.92G - 0% 0% 2.00x ONLINE -
Com a deduplicação ativada, o instantâneo ainda é relatado para usar o tamanho extra , mas como você pode ver com zpool list
, a deduplicação está salvando o espaço no disco e fornece uma taxa de desduplicação de 2.
IIRC em geral, não é recomendado usar a deduplicação devido ao uso pesado de memória e ao impacto resultante no desempenho. Acho que há trabalho em andamento para melhorar o recurso de desduplicação no ZFS.