Frage Es ist nicht möglich, Dateien auf einem großen XFS-Dateisystem zu erstellen


Wir haben einen Linux-Server mit einem 4-TB-Dateisystem, das zum Speichern von Subversion-Repositories dient. Es gibt viele Depots, von denen einige seit mehreren Jahren in Gebrauch sind.

Die Festplatte war ursprünglich etwa 1 TB groß, aber wir haben vor knapp einem Jahr den Speicherplatz aufgebraucht und auf 4 TB erhöht. Nun berichten Leute, dass sie keine Dateien in ihre Repos einchecken können. Die Fehlermeldung ist No space left on device.

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


22
2018-06-02 10:19


Ursprung




Antworten:


Der Grund für das Problem

Das Problem stellt sich heraus, wie XFS Inodes zuweist. Im Gegensatz zu den meisten Dateisystemen erfolgt die Zuweisung dynamisch, wenn neue Dateien erstellt werden. Sofern Sie nichts anderes angeben, sind Inodes auf 32-Bit-Werte beschränkt, was bedeutet, dass sie in das erste Terabyte des Speichers im Dateisystem passen müssen. Wenn Sie also das erste Terabyte vollständig gefüllt haben 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 - Ändern Sie die Mount-Optionen

Eine Lösung besteht darin, das Dateisystem mit der Mount-Option neu zu mounten inode64. Einige Anwendungen verhalten sich jedoch merkwürdig (z. B. MySQL), und NFS wird sehr verwirrt sein. Wenn Sie also nicht sicher sind, ob Ihr System mit dieser Option arbeiten wird, 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 das einfach - das Dateisystem war jahrelang in Verwendung, sodass wir einfach die ältesten Dateien finden und sie aus dem Dateisystem entfernen und sie dann zurück verschieben konnten. Dies wurde mit Hilfe von find leicht gemacht:

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

gab uns eine Liste, die die Größe und den Verzeichnisnamen für alle Verzeichnisse auf genau 3 Ebenen unterhalb des Mountpoints enthielt, die älter als 2 Jahre waren. Wir könnten dann die Liste sortieren, um die größten Verzeichnisse zu finden und zu verwenden mv um sie in ein anderes Dateisystem und wieder zurück zu verschieben.

Verschieben 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 AGs), beginnend mit 0. Sie können die Blockgröße und die Anzahl der Blöcke jedes AGs überprüfen, um herauszufinden, welche Gruppen sich auf dem ersten Terabyte befinden xfs_info /path/to/mountpoint. Oder Sie können nur die ersten AGs überprüfen, um zu sehen, welche voll sind, und dann diese löschen.

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

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

  1. Finde Dateien in dieser AG

Dies erfordert das Überprüfen der Metadaten für jede Datei im Dateisystem. Es wird ein lange Zeit ... Hier ist ein Vorschlag:

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

Sie können dann grep für " 0 " (das ist ein Leerzeichen, eine Null und ein anderes Leerzeichen), um alle Dateien auf AG 0, Grep für zu finden " 1 " um die auf AG 1 zu finden, etc ... Beginne mit AG 0, verschiebe die größten Dateien weg (mit mvnicht cp!) und dann wieder zurück. Wiederholen Sie den Vorgang, bis Sie ausreichend Platz frei haben.

Ergebnis

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


43
2018-06-02 10:19