Dateien im großen XFS-Dateisystem können nicht erstellt werden

24

Wir haben einen Linux-Server mit einem 4-TB-Dateisystem, auf dem Subversion-Repositorys gespeichert werden. Es gibt viele Repositories, von denen einige seit mehreren Jahren in Gebrauch sind.

Die Festplatte hatte ursprünglich ungefähr 1 TB, aber wir hatten nicht mehr genügend Speicherplatz und erhöhten sie vor ungefähr einem Jahr auf 4 TB. Jetzt berichten die Leute, dass sie keine Dateien in ihre Repos einchecken können. Die Fehlermeldung lautet No space left on device.

Die Festplatte hat ungefähr 1,5 TB frei und meldet auch freie Inodes - und dennoch ist es nicht möglich, eine neue Datei darauf zu erstellen. Es ist weiterhin möglich, alte Dateien zu aktualisieren, und einige Repositorys werden zeitweise aktualisiert, aber dasselbe Repository kann beim nächsten Versuch fehlschlagen.

Jenny D sagt Reinstate Monica
quelle

Antworten:

44

Der Grund für das Problem

Es stellt sich heraus, wie XFS Inodes zuweist. Im Gegensatz zu den meisten Dateisystemen erfolgt die Zuordnung dynamisch, wenn neue Dateien erstellt werden. Sofern Sie nichts anderes angeben, sind Inodes jedoch auf 32-Bit-Werte beschränkt. Dies bedeutet, dass sie in das erste Terabyte des Speichers im Dateisystem passen müssen. Wenn Sie also dieses erste Terabyte vollständig ausfüllen und dann die Festplatte vergrößern, können Sie immer noch keine neuen Dateien erstellen, da die Inodes nicht auf dem neuen Speicherplatz erstellt werden können.

Lösung 1 - Mount-Optionen ändern

Eine Lösung besteht darin, das Dateisystem mit der Einhängeoption neu einzuhängen inode64. Einige Anwendungen (z. B. MySQL) verhalten sich jedoch komisch, und NFS ist sehr verwirrt. Wenn Sie nicht sicher sind, ob Ihr System mit dieser Option funktioniert, können Sie mit der nächsten Option fortfahren.

Lösung 2 - Dateien verschieben

Die zweite Lösung besteht darin, einige der Dateien zu finden, die derzeit im ersten Terabyte gespeichert sind, und sie in einen anderen Bereich des Dateisystems zu verschieben.

Umzug nach Alter

In unserem Fall war dies einfach - das Dateisystem war jahrelang in Gebrauch, sodass wir einfach die ältesten Dateien finden und sie aus dem Dateisystem entfernen und dann zurückschieben konnten. Dies war einfach mit find möglich:

find /extra -mindepth 3 -maxdepth 3 -type d -mtime +730 -exec du -sh {} \; > /tmp/olddirs.txt

gaben uns eine Liste mit der Größe und dem Verzeichnisnamen für alle Verzeichnisse auf genau 3 Ebenen unterhalb des Einhängepunkts, die älter als 2 Jahre waren. Wir könnten dann die Liste sortieren, um die größten Verzeichnisse zu finden und mvsie in ein anderes Dateisystem und wieder zurück zu verschieben.

Umzug nach Zuordnungsgruppe

Wenn Sie nicht einfach nach Alter gehen können, z. B. wenn viele Dateien gleichzeitig erstellt wurden, können Sie immer noch die richtigen Dateien zum Verschieben finden, aber es dauert etwas länger.

XFS hat Zuordnungsgruppen (aka AG s), beginnend mit 0. Sie können die Blockgröße und die Anzahl der Blöcke jeder AG sind auf der ersten Terabyte , welche Gruppen , um herauszufinden , zu überprüfen, verwenden xfs_info /path/to/mountpoint. Oder Sie können einfach die ersten AGs überprüfen, um festzustellen, welche voll sind, und diese dann löschen.

  1. Überprüfen des freien Speicherplatzes in den ersten vier AGs:
für ag in `seq 0 1 5`; Echo-Freiraum in AG $ ag; xfs_db -r -c "freesp -s -a $ ag" / dev / CACHE / CACHE; grep "total frei"; getan

Wenn der gesamte freie Speicherplatz in einer Gruppe weniger als 40 beträgt, können Sie keine neuen Dateien darin erstellen.

  1. Finden Sie Dateien in dieser AG

Dies erfordert die Überprüfung der Metadaten für jede Datei im Dateisystem. Es wird lange dauern ... Hier ist ein Vorschlag:

   find / extra -mindepth 3 -type f -exec xfs_bmap -v {} \; > /tmp/agfilelist.txt

Sie können dann nach " 0 "(das ist ein Leerzeichen, eine Null und ein anderes Leerzeichen) suchen, um alle Dateien auf AG 0 " 1 "zu finden, nach den Dateien auf AG 1 suchen, usw. ... Beginnen Sie mit AG 0, und verschieben Sie die größten Dateien mit mvnicht cp!) und dann wieder zurück. Wiederholen Sie diesen Vorgang, bis genügend Speicherplatz frei ist.

Ergebnis

Sobald wir genug Dateien von / extra und dann wieder zurück verschoben hatten, war in AG 0 viel Platz und es war wieder möglich, neue Dateien zu erstellen.

Jenny D sagt Reinstate Monica
quelle