Sistema de arquivos de compactação transparente em conjunto com ext4

26

Estou tentando testar um projeto que precisa de armazenamento compactado com o uso do sistema de arquivos ext4, pois o aplicativo que eu uso depende dos recursos do ext4.

Existem soluções de produção / estáveis ​​para compressão transparente no ext4?

O que eu tentei:

Volume Ext4 sobre ZFS com a compactação ativada. Isso realmente teve um efeito adverso. Tentei criar um volume ZFS com a compactação lz4 ativada e criar um sistema de arquivos ext4 em / dev / zvol / ... mas o volume zfs mostrou o dobro do uso real e a compactação não pareceu ter efeito.

# du -hs /mnt/test
**1.1T**    /mnt/test
# zfs list
NAME        USED  AVAIL  REFER  MOUNTPOINT
pool       15.2T  2.70G   290K  /pool
pool/test  15.2T  13.1T  **2.14T**  -

Comandos de criação do ZFS

zpool create pool raidz2 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde2 /dev/sdf1 /dev/sdg1 /dev/sdh2 /dev/sdi1
zfs set recordsize=128k pool
zfs create -p -V15100GB pool/test
zfs set compression=lz4 pool/test
mkfs.ext4 -m1 -O 64bit,has_journal,extents,huge_file,flex_bg,uninit_bg,dir_nlink /dev/zvol/pool/test

Fusecompress: Parecia funcionar, mas não 100% estável. Procurando alternativas.

LessFS: É possível usar o Lessfs em conjunto com o ext4? Ainda não tentei, mas estaria interessado na percepção do usuário.

Um grande problema: transparência não verdadeira

Um problema que vi com a fusecompress era as cotas. Por exemplo, se eu ativasse a compactação no sistema de arquivos, gostaria que meu sistema se beneficiasse da compactação, não necessariamente o usuário final. Se eu habilitasse uma cota de 1 GB para um usuário, com uma taxa de compactação de 1,5, ele seria capaz de fazer upload de 1,5 GB de dados, em vez de 1 GB de dados e do sistema que se beneficia da compactação. Isso também apareceu no df -h. Existe uma solução para que a compactação seja transparente para cotas?

user235918
fonte
Certo. Você pode listar o SO / distribuição / versão e detalhes sobre a natureza dos dados que pretende armazenar?
ewwhite
Também detalhes de hardware.
ewwhite
1
@ewwhite 8x3TB em um RAID6 de software. Os dados serão backups sincronizados de outros servidores, para tipos de dados mistos e vários usuários finais, documentos, etc. CentOS 6.5 x64.
user235918
Tem certeza de que precisa disso? Você tem muitos arquivos grandes e esparsos? Atualmente, o espaço em disco é barato.
Andrew Schulman
@AndrewSchulman: Tirar vantagem da compressão é o melhor método do meu cálculo. O custo de discos e controladores extras que os suportam é mais do que o custo da CPU.
user235918

Respostas:

27

Eu uso o ZFS no Linux como um gerenciador de volume e um meio de fornecer proteções e funcionalidades adicionais aos sistemas de arquivos tradicionais. Isso inclui trazer instantâneos em nível de bloco, replicação, desduplicação, compactação e cache avançado para os sistemas de arquivos XFS ou ext4.

Consulte: https://pthree.org/2012/12/21/zfs-administration-part-xiv-zvols/ para obter outra explicação.

No meu caso de uso mais comum, aproveito o recurso ZFS zvol para criar um volume esparso em um zpool existente. As propriedades desse zvol podem ser definidas como as de um sistema de arquivos ZFS normal. Nesta conjuntura, você pode definir propriedades como tipo de compactação, tamanho do volume, método de cache, etc.

A criação deste zvol apresenta um dispositivo de bloco para o Linux que pode ser formatado com o sistema de arquivos de sua escolha. Use fdiskou partedpara criar sua partição e mkfso volume final.

Monte isso e você essencialmente terá um sistema de arquivos apoiado por um zvol e com todas as suas propriedades.


Aqui está o meu fluxo de trabalho ...

Crie um zpool composto por quatro discos:
você desejará a ashift=12diretiva para o tipo de disco que está usando. O nome do zpool é "vol0" neste caso.

zpool create -o ashift = 12 -f vol0 espelho scsi-AccOW140403AS1322043 scsi-AccOW140403AS1322042 espelho scsi-AccOW140403AS1322013 scsi-AccOW140403AS1322044

Definir configurações iniciais do zpool:
defino autoexpand=onno nível do zpool caso substitua os discos por unidades maiores ou expanda o pool em uma configuração de espelhos do ZFS . Normalmente, não uso o ZFS raidz1 / 2/3 devido ao baixo desempenho e à incapacidade de expandir o zpool.

zpool set autoexpand=on vol0

Definir propriedades iniciais do sistema de arquivos zfs:
Use o lz4algoritmo de compactação para novas instalações do ZFS. Não há problema em deixá-lo ligado o tempo todo.

zfs set compression=lz4 vol0
zfs set atime=off vol0

Criar zvol do ZFS:
para o ZFS no Linux, é muito importante usar um tamanho de bloco grande. -o volblocksize=128ké absolutamente essencial aqui. A -sopção cria um zvol esparso e não consome espaço na piscina até que seja necessário. Você pode se comprometer demais aqui, se conhece bem seus dados. Nesse caso, tenho cerca de 444 GB de espaço em disco utilizável no pool, mas estou apresentando um volume de 800 GB ao XFS.

zfs create -o volblocksize=128K -s -V 800G vol0/pprovol

Dispositivo de partição zvol:
( deve ser / dev / zd0 para o primeiro zvol; / dev / zd16, / dev / zd32, etc. para zvols subsequentes )

fdisk /dev/zd0 # (create new aligned partition with the "c" and "u" parameters)

Crie e monte o sistema de arquivos:
mkfs.xfs ou ext4 na partição recém-criada, / dev / zd0p1.

mkfs.xfs -f -l size=256m,version=2 -s size=4096 /dev/zd0p1

Pegue o UUID blkide modifique-o /etc/fstab.

UUID=455cae52-89e0-4fb3-a896-8f597a1ea402 /ppro       xfs     noatime,logbufs=8,logbsize=256k 1 2

Monte o novo sistema de arquivos.

mount /ppro/

Resultados...

[root@Testa ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sde2        20G  8.9G  9.9G  48% /
tmpfs            32G     0   32G   0% /dev/shm
/dev/sde1       485M   63M  397M  14% /boot
/dev/sde7       2.0G   68M  1.9G   4% /tmp
/dev/sde3        12G  2.6G  8.7G  24% /usr
/dev/sde6       6.0G  907M  4.8G  16% /var
/dev/zd0p1      800G  398G  403G  50% /ppro  <-- Compressed ZFS-backed XFS filesystem.
vol0            110G  256K  110G   1% /vol0

Listagem do sistema de arquivos ZFS.

[root@Testa ~]# zfs list
NAME           USED  AVAIL  REFER  MOUNTPOINT
vol0           328G   109G   272K  /vol0
vol0/pprovol   326G   109G   186G  -   <-- The actual zvol providing the backing for XFS.
vol1           183G   817G   136K  /vol1
vol1/images    183G   817G   183G  /images

Lista zpool do ZFS.

[root@Testa ~]# zpool list -v
NAME   SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
vol0   444G   328G   116G    73%  1.00x  ONLINE  -
  mirror   222G   164G  58.1G         -
    scsi-AccOW140403AS1322043      -      -      -         -
    scsi-AccOW140403AS1322042      -      -      -         -
  mirror   222G   164G  58.1G         -
    scsi-AccOW140403AS1322013      -      -      -         -
    scsi-AccOW140403AS1322044      -      -      -         -

Propriedades ZFS zvol ( Anote referenced, compressratioevolsize ).

[root@Testa ~]# zfs get all vol0/pprovol
NAME          PROPERTY               VALUE                  SOURCE
vol0/pprovol  type                   volume                 -
vol0/pprovol  creation               Sun May 11 15:27 2014  -
vol0/pprovol  used                   326G                   -
vol0/pprovol  available              109G                   -
vol0/pprovol  referenced             186G                   -
vol0/pprovol  compressratio          2.99x                  -
vol0/pprovol  reservation            none                   default
vol0/pprovol  volsize                800G                   local
vol0/pprovol  volblocksize           128K                   -
vol0/pprovol  checksum               on                     default
vol0/pprovol  compression            lz4                    inherited from vol0
vol0/pprovol  readonly               off                    default
vol0/pprovol  copies                 1                      default
vol0/pprovol  refreservation         none                   default
vol0/pprovol  primarycache           all                    default
vol0/pprovol  secondarycache         all                    default
vol0/pprovol  usedbysnapshots        140G                   -
vol0/pprovol  usedbydataset          186G                   -
vol0/pprovol  usedbychildren         0                      -
vol0/pprovol  usedbyrefreservation   0                      -
vol0/pprovol  logbias                latency                default
vol0/pprovol  dedup                  off                    default
vol0/pprovol  mlslabel               none                   default
vol0/pprovol  sync                   standard               default
vol0/pprovol  refcompressratio       3.32x                  -
vol0/pprovol  written                210M                   -
vol0/pprovol  snapdev                hidden                 default
ewwhite
fonte
Por que particionar o zvol? Não pode ser usado diretamente?
Michael Hampton
3
@MichaelHampton Principalmente pelo alinhamento e consistência. Além disso, quero flexibilidade se expandir o volume subjacente. Existem várias camadas de abstração aqui. É semelhante ao argumento de usar /dev/sdbversus /dev/sdb1.
precisa saber é
1
Obrigado pela sua informação. Muitos bons conselhos aqui. Eu vou testar.
user235918
2
@ MichaelHampton BTW, hoje em dia, não particiono mais ... especialmente com máquinas virtuais.
ewwhite
1
Você pode informar sobre os custos adicionais de recursos para a camada ZFS nesta configuração (RAM, CPU)?
Sz.
4

Você também precisa ativar o descarte no sistema de arquivos ext4. Sem descartar, o zfs não recupera o espaço quando os arquivos são removidos. Isso pode levar a grandes discrepâncias de espaço entre o que o sistema de arquivos ext4 informa e o volume zfs.

Devon
fonte
4
A Red Hat não recomenda fazer isso online com a opção de descarte de montagem (com ext4 ou xfs), pois há um impacto no desempenho. É mais limpo executar o fstrimcomando periodicamente .
precisa saber é o seguinte
escrevi o comentário sobre montagens de descarte que afetam o desempenho: isso acontece com SSDs antigos e de baixa qualidade. Não é verdade com os mais novos.
Stoat