Impossibile creare file sul file system XFS di grandi dimensioni


24

Abbiamo un server Linux con un filesystem da 4 TB, che viene utilizzato per archiviare i repository di sovversione. Esistono molti repository, molti dei quali sono in uso da diversi anni.

Il disco era originariamente di circa 1 TB, ma abbiamo iniziato a corto di spazio e aumentato a 4 TB circa un anno fa. Ora, le persone segnalano di non essere in grado di archiviare i file nei propri repository. Il messaggio di errore è No space left on device.

Il disco ha circa 1,5 TB gratuiti e riporta anche inode gratuiti - eppure non è possibile creare un nuovo file su di esso. È ancora possibile aggiornare i vecchi file e ad intermittenza alcuni archivi verranno aggiornati, ma lo stesso repository potrebbe non riuscire al tentativo successivo.

Risposte:


44

La ragione del problema

Il problema è dovuto al modo in cui XFS alloca gli inode. A differenza della maggior parte dei file system, l'allocazione avviene in modo dinamico quando vengono creati nuovi file. Tuttavia, se non diversamente specificato, gli inode sono limitati a valori a 32 bit, il che significa che devono rientrare nel primo terabyte di archiviazione sul file system. Quindi, se hai riempito completamente quel primo terabyte e poi ingrandisci il disco, non saresti ancora in grado di creare nuovi file, poiché gli inode non possono essere creati nel nuovo spazio.

Soluzione 1: modificare le opzioni di montaggio

Una soluzione è reinstallare il file system con l'opzione mount inode64. Tuttavia alcune applicazioni si comportano in modo strano su questo (ad esempio MySQL) e NFS sarà molto confuso. Quindi, se non sei sicuro che il tuo sistema funzionerà con questa opzione, puoi passare all'opzione successiva.

Soluzione 2: spostare i file

La seconda soluzione è trovare alcuni dei file che sono attualmente memorizzati nel primo terabyte e spostarli in un'altra area del file system.

Muoversi per età

Nel nostro caso, questo è stato facile: il file system era in uso da anni, quindi potevamo semplicemente trovare i file più vecchi e spostarli dal file system, quindi spostarli indietro. Questo è stato fatto facilmente usando find:

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

ci ha fornito un elenco contenente le dimensioni e il nome della directory per tutte le directory esattamente a 3 livelli al di sotto del mountpoint, che erano più vecchi di 2 anni. Potremmo quindi ordinare l'elenco per trovare le directory più grandi e utilizzarle mvper spostarle in un altro file system e viceversa.

Spostamento per gruppo di allocazione

Se non puoi semplicemente andare per età, ad esempio quando sono stati creati molti file contemporaneamente, puoi comunque trovare i file giusti da spostare, ma ci vuole un po 'più di tempo.

XFS ha gruppi di allocazione (aka AG ), che iniziano con 0. È possibile controllare la dimensione e il numero di blocchi di ogni AG per capire quali gruppi si trovano sul primo terabyte, usando xfs_info /path/to/mountpoint. Oppure puoi semplicemente controllare le prime AG per vedere quali sono piene e quindi cancellarle.

  1. Verifica dello spazio libero nelle prime quattro AG:
per ag in `seq 0 1 5`; fare eco allo spazio libero in AG $ ag; xfs_db -r -c "freesp -s -a $ ag" / dev / CACHE / CACHE; grep "total free"; fatto

Se lo spazio libero totale in qualsiasi gruppo è inferiore a 40, non sarà possibile creare nuovi file al suo interno.

  1. Trova i file in quella AG

Ciò richiede il controllo dei metadati per ciascun file sul filesystem. Ci vorrà molto tempo ... Ecco un suggerimento:

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

Puoi quindi grep per " 0 "(che è uno spazio, uno zero e un altro spazio) per trovare tutti i file su AG 0, grep per " 1 "trovare quelli su AG 1, ecc ... Inizia con AG 0, allontana i file più grandi (usando mv, no cp!) e poi di nuovo indietro. Ripeti finché non avrai una buona quantità di spazio libero.

Risultato

Una volta spostati abbastanza file da / extra e poi di nuovo indietro, c'era molto spazio in AG 0 ed era ancora possibile creare nuovi file.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.