Porovnejte (například) du -bm
do du -m
.
-b
nastaví --apparent-size --block-size=1
, ale pak m
přepíše velikost bloku na 1M
.
Podobné pro -bh
oproti -h
:-bh
znamená --apparent-size --block-size=1 --human-readable
a znovu h
přepíše tuto velikost bloku.
Zdánlivá velikost je počet bajtů, které si vaše aplikace myslí, že jsou v souboru. Je to množství dat, které by bylo přeneseno po síti (nepočítaje hlavičky protokolů), pokud byste se rozhodli odeslat soubor přes FTP nebo HTTP. Je to také výsledek cat theFile | wc -c
a množství adresového prostoru, který by soubor zabral, pokud byste to celé načetli pomocí mmap
.
Využití disku je množství místa, které nelze použít pro něco jiného, protože toto místo zabírá váš soubor.
Ve většině případů je zdánlivá velikost menší než využití disku, protože využití disku počítá plnou velikost posledního (částečného) bloku souboru a zdánlivá velikost počítá pouze data, která jsou v tomto posledním bloku. Zdánlivá velikost je však větší, když máte řídký soubor (řídké soubory se vytvářejí, když hledáte někde za koncem souboru a pak tam něco zapíšete - OS se neobtěžuje vytvářet spoustu bloků plných nul - - vytvoří blok pouze pro tu část souboru, do které jste se rozhodli zapisovat).
Příklad podrobnosti minimálního bloku
Pojďme si trochu zahrát, abychom viděli, co se děje.
mount
říká mi, že jsem na oddílu ext4 připojeném na /
.
Velikost jeho bloku najdu pomocí:
stat -fc %s .
což dává:
4096
Nyní vytvoříme několik souborů o velikosti 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
a výsledky jsou:
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
Vidíme tedy, že cokoli nižší nebo rovné 4096
zabírá 4096
ve skutečnosti bajtů.
Poté, jakmile překročíme 4097
, jde až na 8192
což je 2 * 4096
.
Je tedy jasné, že disk vždy ukládá data na hranici bloku 4096
bajtů.
Co se stane s řídkými soubory?
Nezkoumal jsem, jaká je přesná reprezentace, ale je jasné, že --apparent
bere to v úvahu.
To může vést k tomu, že zdánlivá velikost bude větší než skutečné využití disku.
Například:
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ává:
8192 f
1073741825 f
Související:Jak otestovat, zda je podporován řídký soubor
Co dělat, když chci uložit spoustu malých souborů?
Některé možnosti jsou:
- použijte databázi místo souborového systému:Databáze vs úložiště souborového systému
- použijte souborový systém, který podporuje dílčí přidělování bloků
Bibliografie:
- https://serverfault.com/questions/565966/which-block-sizes-for-millions-of-small-files
- https://askubuntu.com/questions/641900/how-file-system-block-size-works
Testováno v Ubuntu 16.04.