Solaris 11: ZFS Deduplication
Além da compressão, o ZFS também possui o recurso de deduplicação, que faz com que dois (ou mais) arquivos extamente iguais ocupem apenas o espaço de um.
Irei habilitar este recurso no Pool test, que possui 10GB, e está vazio.
ricardo@solaris:~$ uname -a
SunOS solaris 5.11 11.0 i86pc i386 i86pc
ricardo@solaris:~$ ls -lh /test/
total 0
ricardo@solaris:~$ df -h /test/
Filesystem Size Used Available Capacity Mounted on
test 9.8G 31K 9.8G 1% /test
Antes de popular o Pool com uma massa de dados, verifico e habilito o parâmetro de deduplicação para o Pool.
ricardo@solaris:~$ sudo zfs get dedup test
NAME PROPERTY VALUE SOURCE
test dedup off local
ricardo@solaris:~$ sudo zfs set dedup=on test
ricardo@solaris:~$ sudo zfs get dedup test
NAME PROPERTY VALUE SOURCE
test dedup on local
Agora crio dois diretórios no Pool, e copio um conteúdo para um deles, verificando o espaço utilizado em seguida.
ricardo@solaris:~$ mkdir /test/Docs01
ricardo@solaris:~$ mkdir /test/Docs02
ricardo@solaris:~$ cp -rf Documents/Documentação/ /test/Docs01
ricardo@solaris:~$ du -sh /test/Docs01/
1.2G /test/Docs01
ricardo@solaris:~$ df -h /test/
Filesystem Size Used Available Capacity Mounted on
test 9.8G 1.2G 8.6G 13% /test
Em seguida copio o mesmo conteúdo para o outro diretório.
Com o comando du, verifico que cada um deles ocupa 1.3GB (antes o primeiro ocupava 1.2GB), mas o comando df me mostra que o sistema de arquivos está com 8.5GB livres (antes tinha 8.6GB livres), mas o espaço total cresceu (!) de 9.8GB para 11GB, assim como o espaço utilizado (de 1.2GB para 2.6GB).
ricardo@solaris:~$ cp -rf Documents/Documentação/ /test/Docs02
ricardo@solaris:~$ du -sh /test/Docs01/
1.3G /test/Docs01
ricardo@solaris:~$ du -sh /test/Docs02/
1.3G /test/Docs02
ricardo@solaris:~$ df -h /test/
Filesystem Size Used Available Capacity Mounted on
test 11G 2.6G 8.5G 24% /test
Executo a cópia mais uma vez, para um terceiro diretório. O sistema de arquivos continua com 8.5GB livres, mas agora ele “cresceu” para 12GB, e o espaço utilizado para 3.9GB.
ricardo@solaris:~$ mkdir /test/Docs03
ricardo@solaris:~$ cp -rf Documents/Documentação/ /test/Docs03
ricardo@solaris:~$ du -sh /test/Docs03/
1.3G /test/Docs03
ricardo@solaris:~$ df -h /test/
Filesystem Size Used Available Capacity Mounted on
test 12G 3.9G 8.5G 32% /test
Isto acontece porque os comandos du e df não são apropriados para tratar a deduplicação do ZFS. Esta verificação deve ser feita com os comandos zfs e zpool, como está abaixo. Veja que o tamanho do Pool está com o tamanho correto (9.94GB), o espaço alocado possui o tamanho de apenas um dos diretórios copiados, e a coluna DEDUP mostra que a deduplicação está em 3.13x (já que temos três diretórios com o mesmo conteúdo).
ricardo@solaris:~$ zfs list test
NAME USED AVAIL REFER MOUNTPOINT
test 3.92G 8.47G 3.91G /test
ricardo@solaris:~$ zpool list test
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
test 9.94G 1.27G 8.67G 12% 3.13x ONLINE -
E repetindo mais uma vez, com um quarto diretório, a análise continua incorreta pelos comandos du e df, mas correta pelo zlist e zpool. Veja que deduplicação passou para 4.18x.
ricardo@solaris:~$ mkdir /test/Docs04
ricardo@solaris:~$ cp -rf Documents/Documentação/ /test/Docs04
ricardo@solaris:~$ df -h /test/
Filesystem Size Used Available Capacity Mounted on
test 14G 5.2G 8.4G 39% /test
ricardo@solaris:~$ du -sh /test/Docs04
1.3G /test/Docs04
ricardo@solaris:~$ zfs list test
NAME USED AVAIL REFER MOUNTPOINT
test 5.22G 8.44G 5.21G /test
ricardo@solaris:~$ zpool list test
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
test 9.94G 1.28G 8.66G 12% 4.18x ONLINE -
ricardo@solaris:~$
Imagine os benefícios em um File Server de uma grande empresa, onde é comum existirem várias cópias de um mesmo documento.