A gravação de dados idênticos em blocos de um arquivo no ZFS usa espaço em instantâneos?

3

Eu tenho um arquivo 16M.

Eu faço um instantâneo do sistema de arquivos ZFS que o contém.

Se eu sobrescrever o arquivo com os mesmos dados, o ZFS precisará armazenar duas cópias de todos os blocos do arquivo?

    
por fadedbee 28.02.2018 / 14:53

1 resposta

3

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.

    
por 01.03.2018 / 18:45