zfs confusão de uso de disco de nível de arquivo linux

0

Estou usando o ZFS no Linux e estou confuso sobre o motivo pelo qual o uso real do disco de arquivos (conforme relatado por 'du') parece tão em todo o lugar.

Eu criei um pool chamado 'vault' em um hardware Dell PERC RAID (apenas / dev / sdb) recebendo todos os padrões, exceto autoexpand 'on'

Eu criei um volume usando

-o reserv = 2040G -o quota = 2040G -o recsize = 4k -o acltype = posixacl

Eu então rsync'ed um volume ext4 para ele. Por exemplo, neste volume existem dois arquivos de dados (arquivos Matlab * .mat) com 13104 e 11264 bytes de tamanho. No sistema de arquivos ext4, nesses arquivos, 16K e 12K correspondem respectivamente ao tamanho do bloco de 4K. Qualquer arquivo < 4K sempre dirá 4K de du.

Em contraste com o ZFS, um du desses dois arquivos mostra 25K e 21K respectivamente, enquanto que em um arquivo de 1 byte eu recebo 4.5K. O extra de .5K no último não é muito alarmante devido ao uso de vários metadados, eu acho. Alguns outros arquivos < 4K que tenho executar du on embora volte exatamente 4K. O mais confuso é por que os du's estão nos arquivos * .mat quase o dobro do tamanho dos dados "reais"?

    
por raines 07.09.2018 / 22:25

1 resposta

2

Você pode usar zdb para determinar informações como esta - basta pegar o inode e o conjunto de dados. Por exemplo, se o conjunto de dados tiver o nome tank/foo , você poderá usar ls -i para determinar o número do inode e, em seguida, zdb -ddddd tank/foo $INODE para despejar as informações.

Veja um exemplo na minha máquina:

# cd /var/tmp
# mkfile 13104 file1
# ls -i file1
  4125 file1
# zdb -ddddd rpool/VARSHARE/tmp 4125
Dataset rpool/VARSHARE/tmp [ZPL], ID 4128, cr_txg 928175, 8.24G, 1223 objects, rootbp DVA[0]=<0:1f62907a00:200:STD:1> DVA[1]=<0:f4a2eda00:200:STD:1> [L0 DMU objset] fletcher4 lzjb LE unique unencrypted size=800L/200P birth=14962025L/14962025P fill=1223 contiguous 2-copy cksum=1b152e5f60:7b661ed2ecb:1445f97091785:278e0e37baf85b

    Object  lvl   iblk   dblk  dsize  lsize   %full  type
      4125    1    16K  13.0K  13.0K  13.0K  100.00  ZFS plain file
                                        168   bonus  System attributes
        dnode flags: USED_BYTES USERUSED_ACCOUNTED 
        dnode maxblkid: 0
        path    /file1
        uid     0
        gid     0
        atime   Fri Sep  7 18:48:00 2018
        mtime   Fri Sep  7 18:48:00 2018
        ctime   Fri Sep  7 18:48:00 2018
        crtime  Fri Sep  7 18:48:00 2018
        gen     14962023
        mode    0100600
        size    13104
        parent  4
        links   1
        pflags  0x40800000204
Indirect blocks:
                 0 L0 0:0x1f55eb0200:0x3400 0x3400L/0x3400P F=1 B=14962023/14962023 ---

                segment [000000000000000000, 0x0000000000003400) size 13.0K
#

Isso permitirá que você saiba o tamanho dos dados e a quantidade de metadados (denominados "blocos indiretos") que seu arquivo está consumindo.

No caso aqui, ele alocou um bloco de 13k exatamente e está usando um único bloco indireto de 16k. Então, está usando 29k para armazenar o arquivo 13k. Eu estou supondo que seus números serão semelhantes.

Note que o 16k "iblk" é muito provavelmente comprimido, então é uma boa aposta que ele esteja ocupando apenas 4k fisicamente.

    
por 08.09.2018 / 00:54

Tags