Kein freier Speicherplatz auf dem Gerät beim Verschieben von 700.000 Dateien in ein einzelnes Verzeichnis innerhalb desselben FS

Kein freier Speicherplatz auf dem Gerät beim Verschieben von 700.000 Dateien in ein einzelnes Verzeichnis innerhalb desselben FS

Ich verwende den folgenden Befehl, um eine große Anzahl von Dateien auf meinem Server zu finden und zu verschieben:

find SomeDir/ -maxdepth 10 -type f -mtime +90 -exec mv {} SomeDir2/ \;

Nach dem Verschieben von etwa 700.000 Dateien erhalte ich diese Fehlermeldung:

mv: cannot move ‘SomeDir/Dir1/Dir2/Dir3/file.jpg.gz’ to ‘SomeDir2/file.jpg.gz’: No space left on device

df -ihat folgendes Ergebnis:

/dev/sdb1           322125824 144163358 177962466   45% /files

df -hhat folgendes Ergebnis:

/dev/sdb1            4.8T  3.5T  1.1T   78%   /files

Ich mache alle Operationen auf /filesund keine anderen Verzeichnisse

Das Dateisystem ist ext4.

AKTUALISIEREN

Wie vorgeschlagen, führe ich es aus dmesg -Hwxund die Ausgabe istEXT4-fs warning (device sdb1): ext4_dx_add_entry:2016: Directory index full!

Antwort1

Sie überschreiten wahrscheinlich den max_dir_size_kbbeim Einhängen des Verzeichnisses festgelegten Wert (oder belassen ihn als Standardwert):

Linux-Dokumente:

max_dir_size_kb=n
    This limits the size of the directories so that any
    attempt to expand them beyond the specified limit in
    kilobytes will cause an ENOSPC error. This is useful in
    memory-constrained environments, where a very large
    directory can cause severe performance problems or even
    provoke the Out Of Memory killer. (For example, if there
    is only 512 MB memory available, a 176 MB directory may
    seriously cramp the system's style.)

( ENOSPCentspricht der Fehlermeldung No space left on devicemit perror)

Stellen Sie daher sicher, dass diese Option beim Mounten nicht angegeben wurde (oder mit einer sehr großen Zahl angegeben wurde).

Außerdem Bemerkungen:

  • zu viele Dateien in einem Ordner klingt nach keiner guten Idee. Möchten Sie stattdessen vielleicht eine relationale Datenbank? Objektspeicher?
  • 4,8 TB: Das ist bei modernen Festplatten keine Seltenheit, aber mal ehrlich: Wenn Sie heutzutage das nächste Mal etwas einrichten, verwenden Sie einen Speicherpool wie LVM. Damit können Sie beispielsweise Snapshots von Live-Systemen erstellen.

Antwort2

Mit den neu gewonnenen Informationen:

Wenn ich also die Zeile 2007 von linux/fs/ext4/namei.c im Git-Tag v3.10 (also Ihrem Kernel) lese, glaube ich, dass Sie Pech haben und Ihr Dateisystem anpassen müssen.

tune2fs -O large_dir /dev/sdb1

sollte es Ihnen ermöglichen, mehr pro Verzeichnis zu haben dx_entries, aber ehrlich gesagt habe ich das nie gemacht. Machen Sie wie immer Backups.

Stellen Sie sicher, dass Sie Backups haben, oder wenden Sie dies auf ein neues Dateisystem an, in das Sie diese Dateien kopieren, anstatt sie innerhalb desselben Dateisystems zu verschieben. Es klingt vielleicht so, als wäre ich ein XFS-Fanboy (bin ich nicht, es funktioniert einfach), aber ich denke, das klingt wirklich nicht so, als wäre ein nicht optimiertes ext4 ein großartiges Dateisystem für diesen Anwendungsfall.

verwandte Informationen