Vergleichen Sie (zum Beispiel) du -bm
bis du -m
.
Die -b
setzt --apparent-size --block-size=1
,aber dann die m
überschreibt die Blockgröße auf 1M
.
Ähnlich für -bh
gegenüber -h
:die -bh
bedeutet --apparent-size --block-size=1 --human-readable
, und wieder h
überschreibt diese Blockgröße.
Scheinbare Größe ist die Anzahl der Bytes, von denen Ihre Anwendungen denken, dass sie in der Datei sind. Es ist die Datenmenge, die über das Netzwerk übertragen würde (ohne Protokollheader), wenn Sie sich entscheiden, die Datei über FTP oder HTTP zu senden. Es ist auch das Ergebnis von cat theFile | wc -c
, und die Menge an Adressraum, die die Datei einnehmen würde, wenn Sie das Ganze mit mmap
laden würden .
Festplattennutzung ist die Menge an Speicherplatz, die nicht für etwas anderes verwendet werden kann, da Ihre Datei diesen Speicherplatz belegt.
In den meisten Fällen ist die scheinbare Größe kleiner als die Festplattennutzung, da die Festplattennutzung die volle Größe des letzten (Teil-)Blocks der Datei zählt und die scheinbare Größe nur die Daten zählt, die sich in diesem letzten Block befinden. Die scheinbare Größe ist jedoch größer, wenn Sie eine Sparse-Datei haben (Spase-Dateien werden erstellt, wenn Sie irgendwo nach dem Ende der Datei suchen und dann etwas dort schreiben - das Betriebssystem macht sich nicht die Mühe, viele mit Nullen gefüllte Blöcke zu erstellen - - Es erstellt nur einen Block für den Teil der Datei, in den Sie schreiben möchten).
Beispiel für minimale Blockgranularität
Lass uns ein bisschen spielen, um zu sehen, was los ist.
mount
sagt mir, dass ich mich auf einer ext4-Partition befinde, die unter /
gemountet ist .
Ich finde seine Blockgröße mit:
stat -fc %s .
was ergibt:
4096
Lassen Sie uns nun einige Dateien mit der Größe 1 4095 4096 4097
erstellen :
#!/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
und die Ergebnisse sind:
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
Wir sehen also, dass alles kleiner oder gleich 4096
ist nimmt 4096
auf Bytes in der Tat.
Dann, sobald wir 4097
überqueren , es geht bis 8192
das ist 2 * 4096
.
Es ist also klar, dass die Platte Daten immer an einer Blockgrenze von 4096
speichert Bytes.
Was passiert mit Sparse-Dateien?
Ich habe nicht untersucht, was die genaue Darstellung ist, aber es ist klar, dass --apparent
berücksichtigt es.
Dies kann dazu führen, dass die scheinbare Größe größer ist als die tatsächliche Festplattennutzung.
Zum Beispiel:
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
ergibt:
8192 f
1073741825 f
Verwandte:So testen Sie, ob Sparse-Dateien unterstützt werden
Was tun, wenn ich viele kleine Dateien speichern möchte?
Einige Möglichkeiten sind:
- Verwenden Sie eine Datenbank anstelle eines Dateisystems:Datenbank vs. Dateisystemspeicherung
- Verwenden Sie ein Dateisystem, das die Unterzuordnung von Blöcken unterstützt
Literatur:
- https://serverfault.com/questions/565966/which-block-sizes-for-millions-of-small-files
- https://askubuntu.com/questions/641900/how-file-system-block-size-works
Getestet in Ubuntu 16.04.