Perché i miei filesystem XFS improvvisamente consumano più spazio e sono pieni di file sparsi?


62

Ho eseguito filesystem XFS come partizioni di crescita / dati per quasi 10 anni su vari server Linux.

Ho notato uno strano fenomeno con i recenti server CentOS / RHEL che eseguono la versione 6.2+.

L'utilizzo stabile del filesystem è diventato molto variabile a seguito del passaggio alla nuova versione del sistema operativo da EL6.0 e EL6.1. I sistemi inizialmente installati con EL6.2 + presentano lo stesso comportamento; mostrando oscillazioni selvagge nell'utilizzo del disco sulle partizioni XFS (Vedi la linea blu nel grafico sotto).

Prima e dopo. L'aggiornamento dalla 6.1 alla 6.2 è avvenuto sabato. grafico xfs

Il grafico sull'utilizzo del disco dello scorso trimestre dello stesso sistema, che mostra le fluttuazioni dell'ultima settimana. inserisci qui la descrizione dell'immagine

Ho iniziato a controllare i filesystem per file di grandi dimensioni e processi in fuga (file di registro, forse?). Ho scoperto che i miei file più grandi riportavano valori diversi da due ls. Correre ducon e senza l' --apparent-sizeinterruttore mostra la differenza.

# du -skh SOD0005.TXT
29G     SOD0005.TXT

# du -skh --apparent-size SOD0005.TXT
21G     SOD0005.TXT

Un rapido controllo usando l' utilità ncdu nell'intero filesystem ha prodotto:

Total disk usage: 436.8GiB  Apparent size: 365.2GiB  Items: 863258

Il filesystem è pieno di file sparsi , con quasi 70 GB di spazio perso rispetto alla versione precedente del sistema operativo / kernel!

Ho esaminato il Red Hat Bugzilla e ho modificato i log per vedere se c'erano segnalazioni dello stesso comportamento o nuovi annunci riguardanti XFS.

Nada.

Sono andato da kernel versione 2.6.32-131.17.1.el6 al 2.6.32-220.23.1.el6 durante l'aggiornamento; nessuna modifica nel numero di versione secondario.

Ho controllato la frammentazione dei file con lo filefragstrumento. Alcuni dei file più grandi sulla partizione XFS avevano migliaia di estensioni. L'esecuzione della deframmentazione online con xfs_fsr -vdurante un periodo di attività lento ha contribuito a ridurre temporaneamente l'utilizzo del disco (vedere Mercoledì nel primo grafico sopra). Tuttavia, l'utilizzo è aumentato rapidamente non appena è stata ripristinata l'attività pesante del sistema.

Cosa sta succedendo qui?


2
Mmm ... Piazza ....
Tom O'Connor,

Risposte:


76

Ho rintracciato questo problema in una discussione su un commit all'albero dei sorgenti di XFS a partire da dicembre 2010. La patch è stata introdotta in Kernel 2.6.38 (e ovviamente, in seguito è stata importata in alcuni kernel di distribuzione Linux popolari).

Le fluttuazioni osservate nell'uso del disco sono il risultato di una nuova funzionalità; Preallocazione EOF speculativa dinamica XFS .

Questa è una mossa per ridurre la frammentazione dei file durante le scritture in streaming allocando speculativamente lo spazio all'aumentare delle dimensioni del file. La quantità di spazio preallocata per file è dinamica ed è principalmente una funzione dello spazio libero disponibile sul file system (per impedire che si esaurisca completamente lo spazio).

Segue questo programma:

freespace       max prealloc size
  >5%             full extent (8GB)
  4-5%             2GB (8GB >> 2)
  3-4%             1GB (8GB >> 3)
  2-3%           512MB (8GB >> 4)
  1-2%           256MB (8GB >> 5)
  <1%            128MB (8GB >> 6)

Questa è un'aggiunta interessante al filesystem in quanto può aiutare con alcuni dei file enormemente frammentati di cui mi occupo.

Lo spazio aggiuntivo può essere recuperato temporaneamente liberando pagecache, dentries e inode con:

sync; echo 3 > /proc/sys/vm/drop_caches

La funzione può essere disabilitata interamente definendo un allocsizevalore durante il montaggio del filesystem. L'impostazione predefinita per XFS è allocsize=64k.

L'impatto di questo cambiamento sarà probabilmente avvertito dai sistemi di monitoraggio / soglia (che è il modo in cui l'ho colto), ma ha anche influenzato i sistemi di database e potrebbe causare risultati imprevedibili o indesiderati per macchine virtuali con thin provisioning e array di archiviazione (useranno più spazio di quanto ti aspetti).

Tutto sommato, mi ha colto di sorpresa perché non c'erano annunci chiari sulla modifica del filesystem a livello di distribuzione o persino nel monitoraggio della mailing list di XFS .


Modifica : le
prestazioni sui volumi XFS con questa funzione sono drasticamente migliorate. Vedo una frammentazione costante <1% su volumi che in precedenza avevano visualizzato una frammentazione fino al 50%. La performance di scrittura è aumentata a livello globale!

Statistiche dallo stesso set di dati, confrontando XFS legacy con la versione in EL6.3.

Vecchio:

# xfs_db -r -c frag /dev/cciss/c0d0p9
actual 1874760, ideal 1256876, fragmentation factor 32.96%

Nuovo:

# xfs_db -r -c frag /dev/sdb1
actual 1201423, ideal 1190967, fragmentation factor 0.87%

4
Un milione di voti positivi e il mio regno per te
Joel E Salas,

1
Grazie! Siamo appena passati da Debian Squeeze a Ubuntu e ci chiedevamo perché du e ls stessero mostrando valori così selvaggiamente diversi per file di grandi dimensioni (ad es. 50 Mb contro 64 Mb)
Giles Thomas

1
@ewwhite Hai disattivato questa funzione per recuperare lo spazio? O questo articolo sta solo dicendo, ehi, questa funzione è ciò che ha causato la discrepanza nelle dimensioni riportate? Sembra "su sistemi di database o VM con thin provisioning, considera la possibilità di disattivarlo", ma alla fine non sono sicuro di cosa tu abbia deciso di fare.
JDS,

2
@jds lo lascio acceso. Elimina la frammentazione e ha migliorato le prestazioni delle mie applicazioni.
ewwhite,

3
Oh, meravigliosa scoperta. Questo utilizzava 750 GB su 35 GB di file. Dopo xfs_fsrè tornato a circa 35 GB. Dovrò tenerlo d'occhio
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.