Confronta (per esempio) du -bm
a du -m
.
Il -b
imposta --apparent-size --block-size=1
,ma poi il m
sovrascrive la dimensione del blocco in 1M
.
Simile per -bh
contro -h
:il -bh
significa --apparent-size --block-size=1 --human-readable
, e ancora h
sovrascrive quella dimensione del blocco.
Dimensione apparente è il numero di byte che le tue applicazioni pensano siano nel file. È la quantità di dati che verrebbero trasferiti sulla rete (senza contare le intestazioni del protocollo) se decidessi di inviare il file tramite FTP o HTTP. È anche il risultato di cat theFile | wc -c
e la quantità di spazio degli indirizzi che il file occuperebbe se caricassi tutto usando mmap
.
Utilizzo del disco è la quantità di spazio che non può essere utilizzata per qualcos'altro perché il tuo file sta occupando quello spazio.
Nella maggior parte dei casi, la dimensione apparente è inferiore all'utilizzo del disco perché l'utilizzo del disco conta l'intera dimensione dell'ultimo blocco (parziale) del file e la dimensione apparente conta solo i dati che si trovano nell'ultimo blocco. Tuttavia, la dimensione apparente è maggiore quando hai un file sparse (i file sparsi vengono creati quando cerchi da qualche parte oltre la fine del file e poi scrivi qualcosa lì - il sistema operativo non si preoccupa di creare molti blocchi pieni di zeri - - crea un blocco solo per la parte del file su cui hai deciso di scrivere).
Esempio di granularità minima del blocco
Giochiamo un po' per vedere cosa sta succedendo.
mount
mi dice che sono su una partizione ext4 montata su /
.
Trovo la sua dimensione del blocco con:
stat -fc %s .
che dà:
4096
Ora creiamo alcuni file con dimensioni 1 4095 4096 4097
:
#!/usr/bin/env bash
for size in 1 4095 4096 4097; do
dd if=/dev/zero of=f bs=1 count="${size}" status=none
echo "size ${size}"
echo "real $(du --block-size=1 f)"
echo "apparent $(du --block-size=1 --apparent-size f)"
echo
done
e i risultati sono:
size 1
real 4096 f
apparent 1 f
size 4095
real 4096 f
apparent 4095 f
size 4096
real 4096 f
apparent 4096 f
size 4097
real 8192 f
apparent 4097 f
Quindi vediamo che qualsiasi cosa inferiore o uguale a 4096
occupa 4096
byte in effetti.
Quindi, non appena attraversiamo 4097
, va fino a 8192
che è 2 * 4096
.
È chiaro quindi che il disco memorizza sempre i dati in un limite di blocco di 4096
byte.
Cosa succede ai file sparse?
Non ho indagato su quale sia la rappresentazione esatta, ma è chiaro che --apparent
lo prende in considerazione.
Questo può portare a dimensioni apparenti maggiori dell'effettivo utilizzo del disco.
Ad esempio:
dd seek=1G if=/dev/zero of=f bs=1 count=1 status=none
du --block-size=1 f
du --block-size=1 --apparent f
dà:
8192 f
1073741825 f
Correlati:come verificare se il file sparse è supportato
Cosa devo fare se desidero archiviare una serie di file di piccole dimensioni?
Alcune possibilità sono:
- usa un database invece di un filesystem:database vs storage su file system
- usa un filesystem che supporti la suballocazione dei blocchi
Bibliografia:
- https://serverfault.com/questions/565966/which-block-sizes-for-milions-of-small-files
- https://askubuntu.com/questions/641900/how-file-system-block-size-works
Testato in Ubuntu 16.04.