GNU/Linux >> LINUX-Kenntnisse >  >> Linux

warum unterscheidet sich die Ausgabe von `du` oft so sehr von `du -b`

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.


Linux
  1. Warum ich von Mac zu Linux gewechselt bin

  2. Grep – Warum entfernen Klammern im Grep-Muster den Grep-Prozess aus Ps-Ergebnissen?

  3. Linux – Die Buffers-Spalte in der Ausgabe von Free?

  4. Holen Sie sich die letzten 4 Zeichen der Ausgabe von Standardausgabe

  5. Warum gibt pr_debug des Linux-Kernels keine Ausgabe aus?

Warum nicht Softwarepakete aus dem Internet installieren

Warum stimmen Ls und Hexdump nicht über die Dateigröße überein?

Wie kann man verhindern, dass `ls` die Ausgabe sortiert?

Warum gibt Ls -l eine andere Größe als Ls -s aus?

Speichern Sie die Ausgabe eines Befehls vom Debian-Terminal in einer Datei

Was ist die Pufferspalte in der Ausgabe von free?