Imansible creare file sul grande filesystem XFS

Abbiamo un server Linux con un file system da 4 TB, utilizzato per memorizzare i repository di sovversione. Ci sono molti repository, alcuni dei quali sono stati in uso per diversi anni.

Il disco era originariamente di circa 1 TB, ma abbiamo iniziato a uscire di spazio e aumentato a 4 TB circa un anno fa. Ora, le persone stanno dichiarando di non essere in grado di controllare i file nei loro repos. Il messaggio di errore non contiene No space left on device .

Il disco ha circa 1,5 TB di spazio libero e segnalazioni di inodes gratuiti e tuttavia non è ansible creare un nuovo file su di esso. È ancora ansible aggiornare i file vecchi e, in modo intermittente, alcuni repository saranno aggiornati, ma lo stesso repository potrebbe fallire nel prossimo tentativo.

  • Come recuperare il file system di XFS con "la lettura di superblock non rioutput"
  • xfs su lvm sull'hardware RAID: parametri corretti?
  • XFS: Nessun spazio rimasto sul dispositivo
  • Come formattare la parità XFS se la stabilità è la cosa più importnte
  • Ubuntu 9.10 cron script 'ec2-consistent-snapshot' in grado di eseguire e accedere ai file
  • Eseguire lo spazio quando si copia tra sisthemes simili XFS
  • get le opzioni mkfs.xfs dal file system xfs esistente
  • Le tabelle Inode si restringono notevolmente nel tempo causando problemi di rsync / inode
  • One Solution collect form web for “Imansible creare file sul grande filesystem XFS”

    La ragione del problema

    Il problema si traduce in come XFS assegna gli inodes. A differenza della maggior parte dei file system, l'allocazione avviene in modo dinamico quando vengono creati nuovi file. Tuttavia, a less che non specificate altrimenti, gli inodes sono limitati a valori a 32 bit, il che significa che devono essere inseriti nel primo terabyte di archiviazione nel file system. Quindi, se hai completato completamente quel primo terabyte e poi ingrandisci il disco, non sarai ancora in grado di creare nuovi file, in quanto gli inodes non possono essere creati sul nuovo spazio.

    Soluzione 1 – modifica le opzioni di assembly

    Una soluzione è quella di reinstallare il file system con l'opzione di assembly inode64 . Tuttavia alcune applicazioni si comporteranno stranamente su questo (ad esempio MySQL) e NFS sarà molto confuso. Quindi, se non sei sicuro che il tuo sistema funziona con questa opzione, puoi passare all'opzione successiva.

    Soluzione 2 – spostare i file

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

    Muoversi per età

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

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

    ci ha dato un elenco contenente la dimensione e il nome di 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 usare mv per spostarli via in un altro file system e tornare indietro.

    Spostamento per gruppo di allocazione

    Se non potete andare semplicemente per età, ad esempio quando un sacco di file sono stati creati contemporaneamente, è ancora ansible trovare i file giusti per spostarsi, ma richiede ancora un po 'di tempo.

    XFS dispone di gruppi di allocazione (aka AG s), a partire da 0. Potreste controllare la dimensione del block e il numero di blocchi di ciascuna AG per calcolare quali gruppi sono sul primo terabyte, utilizzando xfs_info /path/to/mountpoint . Oppure puoi controllare solo le prime AG per vedere quali sono piene e poi cancellarle.

    1. Controllare lo spazio libero nelle prime quattro AG:
      per ag in `seq 0 1 5`;  fare echo freespace in AG $ ag;  xfs_db -r -c "freesp -s -a $ ag" / dev / CACHE / CACHE;  grep "totale libero";  fatto 

    Se lo spazio totale totale di un gruppo è inferiore a 40, non sarà ansible creare nuovi file.

    1. Trova i file in quella AG

    Questo richiede la verifica dei metadati per each file sul filesystem. Ci vorrà molto tempo … Ecco un suggerimento:

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

    Potete poi grep per " 0 " (che è uno spazio, uno zero e un altro spazio) per trovare tutti i file su AG 0, grep per " 1 " per trovare quelli su AG 1, ecc … Inizia con AG 0, sposta i file più grandi lontani (usando mv , non cp !) e poi di nuovo. Ripetere fino a che non si dispone di una quantità abbondante di spazio libero.

    Risultato

    Una volta che abbiamo spostato file sufficienti da / extra e poi di nuovo, c'era un sacco di spazio in AG 0 e è stato ancora una volta ansible creare nuovi file.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.