Parece que o ZFS está transformando um arquivo nulo em um sparsefile quando a compactação está ativada. Extraído do comentário de DeHackEd aqui .
A resposta mais provável à sua pergunta é que os buracos esparsos não são considerados "compactados". Eles são buracos. Você obtém a mesma coisa no ext4 e não suporta compressão. O ZFS transformará todas as páginas nulas em espaços escassos quando a compactação estiver ativada.
Também criei alguns arquivos em um conjunto de dados do ZFS usando um arquivo esparso, um arquivo criado a partir de /dev/zero
e um arquivo criado apenas com o caractere a
para obter uma boa compactação.
Comandos usados para criar os arquivos.
-
truncate -s $((1024*1024*1024)) /tank1/sparsefile
-
dd if=/dev/zero of=/tank1/zerofile bs=1073741824 count=1
- usou alguns loops para ecoar
a
noafile
Primeiro, verifique a compactação no conjunto de arquivos vazio tank1
.
[root@localhost tank1]# zfs get all tank1 | grep compress
tank1 compressratio 1.00x -
tank1 compression lz4 local
tank1 refcompressratio 1.01x -
Em seguida, crie um arquivo esparso e um arquivo de /dev/zero
com um tamanho de 1 GB e verifique a compactação novamente.
[root@localhost tank1]# truncate -s $((1024*1024*1024)) sparsefile
[root@localhost tank1]# dd if=/dev/zero of=/tank1/zerofile bs=1073741824 count=1
[root@localhost tank1]# zfs get all tank1 | grep compress
tank1 compressratio 1.00x -
tank1 compression lz4 local
tank1 refcompressratio 1.01x -
Nada mudou, embora o zerofile deva ser considerado como muito bom e compressível. Ao usar sparsefiles, o espaço nunca é alocado agora, mas apenas sob demanda. Este é o comportamento em qualquer sistema de arquivos, pois este é independente do sistema de arquivos.
Tudo o que é feito é definir o parâmetro Tamanho , mas não aloca blocos como você pode ver em stat
.
[root@localhost tank1]# stat sparsefile
File: ‘sparsefile’
Size: 1073741824 Blocks: 1 IO Block: 131072 regular file
Device: 2ah/42d Inode: 2 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-12-30 15:31:37.512845721 +0100
Modify: 2017-12-30 15:31:37.513845720 +0100
Change: 2017-12-30 15:31:37.513845720 +0100
Birth: -
[root@localhost tank1]# stat zerofile
File: ‘zerofile’
Size: 1073741824 Blocks: 1 IO Block: 131072 regular file
Device: 2ah/42d Inode: 3 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-12-30 15:31:41.742838662 +0100
Modify: 2017-12-30 15:31:42.616837203 +0100
Change: 2017-12-30 15:31:42.616837203 +0100
Birth: -
Assim, o sparsefile e o zerofile são mais ou menos idênticos e têm apenas 1 bloco alocado.
Se fizermos o mesmo em um sistema de arquivos ext4
, poderemos ver a diferença quando os blocos para o zerofile estiverem alocados.
[root@localhost test]$ stat sparsefile
File: sparsefile
Size: 1073741824 Blocks: 0 IO Block: 4096 regular file
Device: fd02h/64770d Inode: 2883724 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ root) Gid: ( 1000/ root)
Access: 2017-12-30 15:53:46.477442716 +0100
Modify: 2017-12-30 15:53:46.477442716 +0100
Change: 2017-12-30 15:53:46.477442716 +0100
Birth: -
[root@localhost test]$ stat zerofile
File: zerofile
Size: 1073741824 Blocks: 2097160 IO Block: 4096 regular file
Device: fd02h/64770d Inode: 2884453 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ root) Gid: ( 1000/ root)
Access: 2017-12-30 15:54:11.014403727 +0100
Modify: 2017-12-30 15:54:11.311403254 +0100
Change: 2017-12-30 15:54:11.311403254 +0100
Birth: -
Agora, vamos examinar um exemplo com um arquivo, contendo apenas o caractere a
com um tamanho de 1 GB no ZFS.
[root@localhost tank1]# du -h afile
33M afile
[root@localhost tank1]# du -h afile --apparent-size
1.0G afile
[root@localhost tank1]# zfs get all tank1 | grep compress
tank1 compressratio 31.16x -
tank1 compression lz4 local
tank1 refcompressratio 31.89x -
Excelente taxa de compactação e diferente de um arquivo contendo zeros
.