Comparer (par exemple) du -bm
à du -m
.
Le -b
définit --apparent-size --block-size=1
,mais alors le m
remplace la taille de bloc par 1M
.
Similaire pour -bh
contre -h
:le -bh
signifie --apparent-size --block-size=1 --human-readable
, et encore le h
remplace cette taille de bloc.
Taille apparente est le nombre d'octets que vos applications pensent être dans le fichier. C'est la quantité de données qui seraient transférées sur le réseau (sans compter les en-têtes de protocole) si vous décidiez d'envoyer le fichier via FTP ou HTTP. C'est aussi le résultat de cat theFile | wc -c
, et la quantité d'espace d'adressage que le fichier occuperait si vous chargiez le tout en utilisant mmap
.
Utilisation du disque est la quantité d'espace qui ne peut pas être utilisée pour autre chose car votre fichier occupe cet espace.
Dans la plupart des cas, la taille apparente est inférieure à l'utilisation du disque, car l'utilisation du disque compte la taille complète du dernier bloc (partiel) du fichier, et la taille apparente ne compte que les données contenues dans ce dernier bloc. Cependant, la taille apparente est plus grande lorsque vous avez un fichier clairsemé (des fichiers clairsemés sont créés lorsque vous cherchez quelque part au-delà de la fin du fichier, puis écrivez quelque chose là-bas - le système d'exploitation ne prend pas la peine de créer beaucoup de blocs remplis de zéros - - il ne crée un bloc que pour la partie du fichier dans laquelle vous avez décidé d'écrire).
Exemple de granularité de bloc minimale
Jouons un peu pour voir ce qui se passe.
mount
me dit que je suis sur une partition ext4 montée à /
.
Je trouve sa taille de bloc avec :
stat -fc %s .
ce qui donne :
4096
Créons maintenant des fichiers avec des tailles 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
et les résultats sont :
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
Nous voyons donc que tout ce qui est inférieur ou égal à 4096
occupe 4096
octets en fait.
Puis, dès que l'on franchit 4097
, il monte jusqu'à 8192
qui est 2 * 4096
.
Il est alors clair que le disque stocke toujours les données à une limite de bloc de 4096
octets.
Qu'advient-il des fichiers fragmentés ?
Je n'ai pas étudié quelle est la représentation exacte, mais il est clair que --apparent
en tient compte.
Cela peut entraîner des tailles apparentes supérieures à l'utilisation réelle du disque.
Par exemple :
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
donne :
8192 f
1073741825 f
En relation :Comment tester si le fichier sparse est pris en charge
Que faire si je veux stocker un tas de petits fichiers ?
Certaines possibilités sont :
- utiliser une base de données au lieu d'un système de fichiers :stockage de la base de données contre le système de fichiers
- utiliser un système de fichiers prenant en charge la sous-allocation de blocs
Bibliographie :
- https://serverfault.com/questions/565966/which-block-sizes-for-millions-of-small-files
- https://askubuntu.com/questions/641900/how-file-system-block-size-works
Testé dans Ubuntu 16.04.