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.