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:
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à.
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.
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.
L'eccezione è la funzione "nocow".
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.
L'uso di nocow significa che btrfs non mantiene i checksum per il contenuto del file.
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.