Perché questi file in un volume ext4 sono frammentati?


19

Ho una ext4partizione da 900 GB su un disco rigido (magnetico) che non presenta difetti e settori danneggiati. La partizione è completamente vuota ad eccezione di una lost+founddirectory vuota . La partizione è stata formattata utilizzando i parametri predefiniti, tranne per il fatto che ho impostato il numero di blocchi di filesystem riservati sull'1%.

Ho scaricato il file ~ 900 MB nella directory xubuntu-15.04-desktop-amd64.isodel punto di montaggio della partizione usando wget. Al termine del download, ho scoperto che il file era diviso in quattro frammenti:

filefrag -v /media/emma/red/xubuntu-15.04-desktop-amd64.iso
Filesystem type is: ef53
File size of /media/emma/red/xubuntu-15.04-desktop-amd64.iso is 1009778688 (246528 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..   32767:      34816..     67583:  32768:            
   1:    32768..   63487:      67584..     98303:  30720:            
   2:    63488..   96255:     100352..    133119:  32768:      98304:
   3:    96256..  126975:     133120..    163839:  30720:            
   4:   126976..  159743:     165888..    198655:  32768:     163840:
   5:   159744..  190463:     198656..    229375:  30720:            
   6:   190464..  223231:     231424..    264191:  32768:     229376:
   7:   223232..  246527:     264192..    287487:  23296:             eof
/media/emma/red/xubuntu-15.04-desktop-amd64.iso: 4 extents found

Pensando che questo potrebbe essere ricollegato in wgetqualche modo, ho rimosso il file ISO dalla partizione, rendendolo nuovamente vuoto, quindi ho copiato il file ~ 700MB v1.mp4nella partizione usando cp. Anche questo file è stato frammentato. È stato diviso in tre frammenti:

filefrag -v /media/emma/red/v1.mp4
Filesystem type is: ef53
File size of /media/emma/red/v1.mp4 is 737904458 (180153 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..   32767:      34816..     67583:  32768:            
   1:    32768..   63487:      67584..     98303:  30720:            
   2:    63488..   96255:     100352..    133119:  32768:      98304:
   3:    96256..  126975:     133120..    163839:  30720:            
   4:   126976..  159743:     165888..    198655:  32768:     163840:
   5:   159744..  180152:     198656..    219064:  20409:             eof
/media/emma/red/v1.mp4: 3 extents found

Perché sta succedendo? E c'è un modo per impedire che ciò accada? Ho pensato che ext4doveva essere resistente alla frammentazione. Invece trovo che frammenta immediatamente un file solitario quando tutto il resto del volume è inutilizzato. Questo sembra essere peggio di entrambi FAT32e NTFS.


4
Sto cercando di immaginare in quali circostanze questo potrebbe eventualmente importare, e sto arrivando vuoto.
Greg Hewgill,

4
@GregHewgill: importava perché pensavo fosse anormale. Ora so che è normale, non importa.
EmmaV,

Risposte:


17

3 o 4 frammenti in un file 900mb sono molto buoni. La frammentazione diventa un problema quando un file di quelle dimensioni ha più di 100 frammenti. Non è raro che fat o ntfs frammentino un tale file in diverse centinaia di pezzi.

In genere non si vedrà meglio di quello almeno sui vecchi filesystem ext4 perché la dimensione massima di un gruppo di blocchi è 128 MB, quindi ogni 128 MB lo spazio contiguo viene interrotto da alcuni blocchi per le bitmap di allocazione e le tabelle di inode per il gruppo di blocchi successivo. Una più recente funzione ext4 chiamata flex_bg consente di raggruppare un numero di gruppi di blocchi (in genere 16) di queste tabelle insieme, lasciando corse più lunghe di blocchi allocabili ma a seconda della distribuzione e della versione di e2fsprogs utilizzata per formattarla, questa opzione può non sono stati usati.

Puoi usare tune2fs -lper verificare le funzionalità abilitate quando il tuo filesystem è stato formattato.


Molto interessante. Ho pensato che tutte le tabelle degli inode ecc. Fossero all'inizio del volume.
EmmaV,

1
@EmmaV distribuendoli sul disco, relativamente vicini ai dati a cui si riferiscono, si
traducono in ricerche

10

Non posso veramente rispondere, ma penso che questo potrebbe aiutare:

Notate come ogni frammento abbia, al massimo, 32768 blocchi di dimensioni (una potenza di 2, che dovrebbe sollevare una bandiera che sta succedendo qualcosa e darvi anche un suggerimento per qualcosa da cercare).

Vale anche la pena notare che quelle compensazioni fisiche tra le estensioni sono piuttosto vicine tra loro.

Da: Ext4 Disk Layout

Un file system ext4 è diviso in una serie di gruppi di blocchi. Per ridurre le difficoltà di prestazioni dovute alla frammentazione, l'allocatore di blocchi si impegna molto per mantenere i blocchi di ciascun file all'interno dello stesso gruppo, riducendo così i tempi di ricerca. La dimensione di un gruppo di blocchi è specificata in sb.s_blocks_per_group blocks, sebbene possa anche essere calcolata come 8 * block_size_in_bytes. Con la dimensione di blocco predefinita di 4KiB, ogni gruppo conterrà 32.768 blocchi, per una lunghezza di 128 MiB

E più in basso:

Il primo strumento utilizzato da ext4 per combattere la frammentazione è l'allocatore multi-blocco. Quando un file viene creato per la prima volta, l'allocatore di blocchi alloca speculativamente 8 KiB di spazio su disco al file [...] Un secondo trucco correlato che utilizza ext4 è l'allocazione ritardata. In base a questo schema, quando un file ha bisogno di più blocchi per assorbire le scritture dei file, il filesystem decide di decidere il posizionamento esatto sul disco fino a quando tutti i buffer sporchi vengono scritti sul disco. Non impegnandosi in un determinato posizionamento fino a quando non è assolutamente necessario (viene colpito il timeout di commit o viene chiamato sync () o il kernel esaurisce la memoria), la speranza è che il filesystem possa prendere decisioni migliori sulla posizione.

Quindi direi che l'allocatore si preoccupa solo della localizzazione dei dati all'interno del gruppo di blocchi (quei blocchi da 32K), ma non dei gruppi di blocchi che sono contigui tra loro.


La prima citazione che hai dato risponde alla mia domanda.
EmmaV,

1
Ogni estensione ha un massimo di 32k blocchi perché è la lunghezza massima che può essere coperta da un descrittore di estensione. Le estensioni non sono frammenti. Se noti che molti dei blocchi fisici delle estensioni seguono immediatamente quelli dell'estensione precedente, e quindi non costituiscono un frammento (6 estensioni contro 3 frammenti).
psusi,
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.