Btrfs bilancia anche la deframmentazione dei file?


9

Quando corro btrfs filesystem balance, questo deframmenta implicitamente i file? Potrei immaginare che l'equilibrio riallochi semplicemente ogni estensione di file separatamente, preservando la frammentazione esistente.

C'è una voce FAQ, "Cosa fa" equilibrio "?" , che non è chiaro su questo punto:

Il bilanciamento del filesystem btrfs è un'operazione che prende semplicemente tutti i dati e i metadati sul filesystem e li riscrive in una posizione diversa sui dischi, facendoli passare attraverso l'algoritmo di allocatore lungo la strada. È stato originariamente progettato per filesystem multi-dispositivo, per diffondere i dati in modo più uniforme su tutti i dispositivi (cioè per "bilanciare" il loro utilizzo). Ciò è particolarmente utile quando si aggiungono nuovi dispositivi a un filesystem quasi completo.

A causa del modo in cui funziona l'equilibrio, ha anche alcuni effetti collaterali utili:

  • Se ci sono molti dati allocati ma inutilizzati o blocchi di metadati, una bilancia può recuperare parte di quello spazio allocato. Questo è il motivo principale per l'esecuzione di un equilibrio su un file system a dispositivo singolo.
  • Su un filesystem con replica danneggiata (ad es. Un RAID-1 FS con un disco guasto e rimosso), costringerà il FS a ricostruire la copia mancante dei dati su uno dei dispositivi attualmente attivi, ripristinando la capacità RAID-1 del filesystem.

Risposte:


9

TL; DR

La funzione di deframmentazione di Btrfs è specifica per correggere la frammentazione dei metadati delle cartelle e del contenuto dei file, mentre la funzione di bilanciamento è stata creata per " bilanciare " (da qui il nome) la quantità di dati condivisi tra le unità ogni volta che un'unità viene aggiunta o rimossa. Sebbene abbiano alcune sovrapposizioni teoriche in ciò che fanno, non sono direttamente correlate, quindi la documentazione non collega le due caratteristiche.

Risposta dettagliata di seguito. Nota ovviamente che la mia lunga risposta è nella speranza che possa aiutare gli altri che non hanno il pieno contesto dei problemi affrontati.


Allocazione del pezzo

Un concetto importante con btrfs è l'allocazione dei blocchi. Quando si scrivono dati su btrfs, li scrive in un blocco "corrente", in genere 1 GB nella dimensione 1 . Se il blocco "corrente" si riempie, alloca un nuovo blocco. Se un blocco esistente viene svuotato, il suo spazio di archiviazione viene reso disponibile per la riassegnazione quando è necessario un nuovo blocco.

Se il filesystem utilizza più di un'unità con i profili di archiviazione "dup", "single" o "raid1" , l'allocatore del blocco preferisce sempre inserire il nuovo blocco successivo nell'unità con lo spazio più disponibile disponibile. Ciò garantisce, in genere, che le unità vengano utilizzate allo stesso modo.


Come l'equilibrio fa la sua cosa

La funzione di bilanciamento funziona prendendo blocchi di dati esistenti e riscrivendoli nel blocco "corrente". Quando un blocco esistente viene svuotato in questo modo, viene automaticamente reso disponibile per l'allocatore. Se il blocco esistente che si sta svuotando non era pieno per cominciare (forse i vecchi dati nel blocco sono stati eliminati), il risultato netto è la liberazione dello spazio su disco poiché il blocco più recente è "compresso più strettamente" con i dati pertinenti.

Questa è la parte che potrebbe, in teoria, essere utilizzata come parte di una strategia di frammentazione , che ritengo sia la ragione per cui molte persone credono che lo faccia già. Tuttavia, ovviamente, la funzione di bilanciamento è stata creata con uno scopo specifico, quindi perché non esamina il contenuto del file. E ' solo controlla se i dati o non sta prendendo fuori i pezzi esistenti è rilevante 2 prima di copiare i dati per il nuovo pezzo.

Da dove viene la parte Balance ?

Quando aggiungi una nuova unità al filesystem, l'allocatore tenderà inizialmente a scrivere tutti i nuovi dati sulla nuova unità, principalmente perché ha più spazio libero disponibile rispetto alle unità esistenti. Riscrivendo tutti i blocchi, tutti i blocchi inizialmente bilanciati vengono scritti solo nella nuova unità. Una volta equalizzato (diventato bilanciato), il resto dei dati verrà equamente riassegnato tra le unità.

Scenario di bilancio tipico:

Ho 2 unità da 500 GB con 240 GB utilizzate su ciascuna; Aggiungo un'altra unità da 500 GB. In genere avrei:

  • guidare a: 240 GB usati
  • unità b: 240 GB usati
  • unità c: 0 GB usati

Inizio un bilancio di tutti i dati. A circa un quarto del saldo, è probabile che io veda una situazione simile alla seguente:

  • guidare un: 180 GB usati
  • unità b: 180 GB usati
  • unità c: 120 GB usati

A circa il terzo segno, sembra essere bilanciato:

  • guidare un: 160 GB usati
  • unità b: 160 GB usati
  • unità c: 160 GB usati

Ovviamente puoi interrompere l'operazione di bilanciamento a questo punto, anche se ci sono ragioni (buone e cattive) per cui potresti voler finire 3 .


Come succede la frammentazione in btrfs

Btrfs è una mucca ( copy on write ) file system, il che significa che i dati sono mai sovrascritto 4 . Se si dispone di un file esistente da 100 MB e si sovrascrive una porzione da 1 MB del file, quella porzione da 1 MB non viene scritta sui dati esistenti sull'unità. Invece è scritto altrove nel pezzo "attuale". Btrfs tiene traccia di dove sono memorizzati questi "frammenti" di nuovi dati. Questo è molto utile per mantenere le istantanee dei dati poiché significa che i vecchi dati sono conservati per impostazione predefinita. Poiché gli SSD, in un modo molto simile, non sovrascrivono mai i dati, questo meccanismo CoW si presta bene a consentire agli SSD di mantenere la durata e le prestazioni.

Dove arriva Defrag

Indipendentemente dai vantaggi, alcuni file vengono sovrascritti molto spesso (in genere file di database), quindi finiscono per avere centinaia di questi frammenti. Con gli SSD, ci sono poche penalità di prestazione a breve termine. Ma con gli azionamenti del mandrino, la penalità delle prestazioni è severa.

Una soluzione ovviamente è usare la funzione di deframmentazione di btrfs. L'operazione di deframmentazione riscrive il contenuto del file nel blocco corrente nell'ordine logico del suo stato corrente, riducendo così i frammenti in un grande set di dati da 100 MB anziché numerosi pezzi separati.

Una soluzione alternativa sarebbe quella di utilizzare la funzione "nocow" appositamente per file come questo. La funzione nocow fa sì che il file venga sovrascritto in posizione. Attenzione che ci sono avvertimenti da osservare 5 6 .


Riepilogo di nuovo

  • La bilancia esamina blocchi e strisce - e in realtà non è a conoscenza del contenuto del file, tranne per il fatto che i dati in tali blocchi siano ancora rilevanti.

  • L'operazione di deframmentazione esamina i dati delle cartelle e il contenuto dei singoli file e riscrive i dati nel modo più contiguo possibile. Il lato negativo è con le istantanee in cui la deframmentazione provoca la duplicazione e l'utilizzo extra dell'unità.


Appunti:

  1. Sebbene i blocchi abbiano in genere una dimensione di 1 GB, possono essere più o meno grandi. Quando si usano i tipi di raid, i blocchi sono generalmente distribuiti su più unità in multipli da 1 GB. Ad esempio, 5 unità con raid0 generano in genere una striscia da 5 GB composta da blocchi da 1 GB da scrivere su ciascuna unità.

  2. Btrfs utilizza "riferimenti" per il contenuto del file. Quando una parte di un file viene sovrascritta, il filesystem live "fa riferimento" alla posizione in cui sono stati scritti quei dati. Un'istantanea potrebbe comunque "fare riferimento" alla vecchia posizione. Se non è presente alcuna snapshot o se la vecchia snapshot viene eliminata, ciò comporta che non rimangano eruzioni di "riferimento" che si riferiscono al contenuto sovrascritto originale. Questo contenuto viene quindi considerato irrilevante e non verrà copiato con gli altri dati rilevanti nell'operazione di bilancio.

  3. A questo punto, supponendo che lo spazio di archiviazione stia utilizzando il semplice profilo "singolo" 7 , i primi 160 GB bilanciati verrebbero tutti spostati sulla nuova unità - ma anche a questo punto, rimangono ancora circa 320 GB da bilanciare. Il resto sarebbe bilanciato equamente tra le unità. Con i mandrini, idealmente si vorrebbe bilanciare solo 160 pezzi prima di avere btrfs riequilibrare tutte e 3 le unità per una migliore "diffusione" dei dati. Con gli SSD, il tentativo di mantenere una "diffusione" uniforme dei dati diventa molto complicato, probabilmente inutile e molto più probabilmente molto dannoso per la durata dell'SSD.

  4. L'eccezione è la funzione "nocow".

  5. Se sono presenti snapshot, la deframmentazione del file "live" fa sì che le snapshot e il file "live" facciano riferimento a posizioni di dati divergenti sul disco, causando la duplicazione dei dati e occupando spazio su disco aggiuntivo. Quando diventa disponibile una funzionalità di deduplicazione per scopi generici, questo non sarà un problema.

  6. L'uso di nocow significa che btrfs non mantiene i checksum per il contenuto del file.

  7. Con la maggior parte dei tipi di raid (raid1 è l'eccezione), "spread" tra le unità è controverso poiché le strisce sono in genere scritte su tutte le unità comunque.


Caspita, ottima risposta. Vedo che c'è una grave carenza di informazioni rilevanti per l'utente di BTRFS, in libri o simili (piuttosto a differenza di ZFS) che sembra contribuire alla sua continua scarsa reputazione. Hai un blog o altre cose buone come questa?
Andrew Keech,

1
Grazie! Dovrei davvero portare alcuni contenuti più aggiornati lì. : - | Il tempo è stato gravemente carente: dogma.swiftspirit.co.za
zaTricky

6

Forse guardando il codice sorgente del comando potrebbe aiutare

Preferire btrfs balance start

Il comando 'btrfs filesystem balance' è obsoleto, utilizzare invece il comando 'btrfs balance start'.

E poi sulla stringa di comando

"btrfs [filesystem] balance start [options] <path>",
"Balance chunks across the devices",
"Balance and/or convert (change allocation profile of) chunks that",
"passed all filters in a comma-separated list of filters for a",
"particular chunk type.  If filter list is not given balance all",
"chunks of that type.  In case none of the -d, -m or -s options is",
"given balance all chunks in a filesystem."

Potrei dare una seconda occhiata ma non riesco a vedere alcun riferimento per deframmentare le strutture né le chiamate ioctl (). Quindi non c'è deframmentazione esplicita.

Tutto ciò che fa è copiare da un posto all'altro e utilizzare l'allocatore predefinito nel processo. Tratto da qui

A seconda dell'allocazione dello scopo e della modalità di allocazione, l'algoritmo cerca direttamente un'estensione continua dello spazio libero in ciascun gruppo di allocazione adatto (un gruppo in btrfs corrisponde a un blocco descritto sopra

Quindi, a seconda della modalità di allocazione, dello spazio libero sul dispositivo e così via, si può dire che btrfs verrà allocato in modo tale che la deframmentazione non sia necessaria. Che potresti considerare una forma di deframmentazione implicita.

HTH


3

L'equilibrio funziona a livello di blocco; blocchi sono come Btrfs implementa la ridondanza dei raid. Non fa nulla a livello di Btree e non deframmenta.


0

Nel caso in cui si utilizzino supporti con elevata latenza di accesso, la frustrazione conta sempre, indipendentemente dal filesystem utilizzato. Una ricerca rimane una ricerca, pediodo.


3
A meno che non si acceda ai dati dall'unità SSD, non significa assolutamente nulla.
Matt,

1
Questo non risponde alla domanda.
Karl Richter,

-2

La deframmentazione è sopravvalutata. Certo, su un FAT16, fa davvero la differenza, ma non su nulla di moderno, nella maggior parte dei casi. In effetti, il ribilanciamento migliorerà l'organizzazione del file system e i file saranno meno frammentati.


6
La frammentazione non è realmente un problema per ext2 / 3/4, xfs, jfs, ecc., Ma può essere un problema significativo per btrfs. Vedi btrfs.wiki.kernel.org/index.php/Gotchas che dice "I file con molte scritture casuali possono diventare fortemente frammentati (oltre 10000 estensioni) causando il cestinamento su HDD e picchi eccessivi di più secondi di carico della CPU su sistemi con un SSD o grandi quantità di RAM. " Non è un'esagerazione, anche per i casi d'uso comuni (file scaricati con database bittorrent, sqlite, ecc.).
nemequ,

2
La deframmentazione può essere molto diversa anche con i file system più moderni, specialmente quando l'unità inizia a riempirsi con un HDD convenzionale. Alcuni file system lo gestiscono meglio di altri e alcuni tipi di file sono peggiori di altri. Spazio ridotto, impossibile ottimizzare scenari, lettura / scrittura cache, readahead, ottimizzazione dell'applicazione e così via tendono a nascondere molto di tutto ciò. Per la maggior parte le persone non devono preoccuparsene e dovrebbero preoccuparsi solo se hanno effettivamente un problema serio che potrebbe essere causato dalla frammentazione.
jgmjgm,
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.