I file vengono salvati in sequenza sul disco?


22

Come ho capito, "file sparse" significa che il file potrebbe avere 'spazi vuoti', quindi i dati effettivamente utilizzati potrebbero essere inferiori alla dimensione del file logico.

In che modo i file system Linux salvano i file su disco? Sono principalmente interessato a ext4. Ma:

  1. È possibile salvare un file non in sequenza sul disco? Con ciò intendo che parte del file si trova all'indirizzo fisico X e la parte successiva all'indirizzo fisico Y che non è vicino all'offset X +).
  2. Posso in qualche modo controllare la sequenzialità dei file?
    Voglio allocare un file di 10 GB. Voglio che sia sequenziale su disco e non diviso tra diversi offset.
  3. Agisce diversamente tra i diversi tipi?


1
Forse, se capisco correttamente le tue intenzioni, saresti più interessato all'API di livello inferiore, dove lavori con dispositivi di archiviazione senza dover passare attraverso il livello del file system. Il punto di ingresso quindi potrebbe essere il dmsetupprogramma, un'interfaccia per il mappatore del dispositivo. Questa potrebbe essere una buona scelta se stai pianificando un archivio simile a un database.
wvxvw,

4
Questo è un dettaglio di implementazione del filesystem. Quasi tutti i filesystem eseguono la frammentazione dei file per impostazione predefinita; solo iso9660e romfsnon sono in grado di farlo e richiedono una memorizzazione continua (di questi posso elencare off-head).
mirabilos,

2
indipendentemente dal fatto che il file sia contiguo sul disco o meno, i dati di lettura / scrittura saranno sempre contigui, a meno che non si esegua una ricerca in un'altra parte del file. Allora perché ti importa di questo? A meno che la frammentazione non sia un problema serio che influisce sulle prestazioni
phuclv,

3
@hudac una cosa da tenere a mente è che contigui non è poi così utile in pratica. Quello semplice è flash in cui la frammentazione non è un grosso problema, ma su un piatto rotante potresti ancora non beneficiare di dati contigui. Su un piatto rotante devi pensare ai tuoi schemi di accesso e alla posizione dei dati. Se hai bisogno del settore che è appena passato sotto la testa, devi aspettare che si ripresenti completamente. Per ottenere i migliori risultati, è necessario scaglionare i dati in modo che siano "vicini" quando devono essere letti. Aumentare la dimensione della cache è più facile ;-)
Ukko

Risposte:


41

È possibile salvare un file non in sequenza sul disco? Voglio dire, parte del file si trova sotto l'indirizzo fisico X e l'altra parte sotto l'indirizzo fisico Y che non è vicino all'offset X +).

Sì; questo è noto come frammentazione dei file e non è raro, specialmente con file più grandi. La maggior parte dei file system alloca lo spazio necessario, più o meno in sequenza, ma non riescono a indovinare il comportamento futuro - quindi se scrivi 200 MiB in un file, quindi aggiungi altri 100 MiB, c'è una probabilità diversa da zero che entrambi i set di dati essere memorizzato in diverse aree del disco (in pratica, qualsiasi altra scrittura che necessita di più spazio sul disco, che si verifica dopo la prima scrittura e prima della seconda, potrebbe trovarsi tra le due). Se un filesystem è quasi pieno, la situazione sarà generalmente peggiore: potrebbe non esserci un'area contigua di spazio libero abbastanza grande da contenere un nuovo file, quindi dovrà essere frammentata.

Posso in qualche modo controllare la sequenzialità dei file? Voglio allocare file di grandi dimensioni da 10 GB. Voglio che sia sequenziale su disco e non divisa tra diversi offset.

Puoi dire al filesystem della dimensione target del tuo file quando viene creato; questo aiuterà il filesystem a memorizzarlo in modo ottimale. Molti file system moderni utilizzano una tecnica nota come allocazione ritardata, in cui il layout su disco di un nuovo file viene calcolato il più tardi possibile, per massimizzare le informazioni disponibili quando viene eseguito il calcolo. Puoi aiutare questo processo usando la posix_fallocate(3)funzione per dire al filesystem quanto spazio su disco dovrebbe essere allocato in totale. I filesystem moderni cercheranno di eseguire questa allocazione in sequenza.

Agisce diversamente tra i diversi tipi?

Diversi filesystem si comportano diversamente, sì. I filesystem basati su log come NILFS2 non allocano l'archiviazione allo stesso modo dei filesystem basati su estensione come Ext4, e questo è solo un esempio di variazione.


1
L'utilizzo fallocate(3)garantirà la sequenzialità dei file? o suggerirà semplicemente il filesystem? Non riesco a capirlo appieno dalle pagine man.
hudac,

6
Non può garantire l'allocazione sequenziale, è solo un suggerimento. Ma dovresti assolutamente usarlo se stai scrivendo file da 10GiB!
Stephen Kitt,

6
Essenzialmente tutti i file system più sofisticati di FAT - questo risale al Berkeley UFS originale - romperà intenzionalmente file di grandi dimensioni e li distribuirà su più "gruppi di allocazione"; questo li aiuta a ridurre al minimo la frammentazione complessiva del disco. Ci può essere un modo per regolare come funziona, ma c'è una buona probabilità che avete di ricreare il file system da zero al fine di farlo, e probabilmente non è un modo per trasformarlo completamente fuori.
zwol,

2
@hudac È impossibile garantire la sequenzialità in tutti i casi (vedere il caso con un disco che è quasi pieno) e, ad essere sinceri, con l'ascesa di SSD è meno importante di quanto non fosse (per chi se lo può permettere almeno ).
Muzer,

1
Si noti inoltre che ci sono situazioni, come i sistemi RAID, in cui avere file contigui è meno efficiente, se possibile. Penso che sia davvero lo scopo di un controller di sottosistema disco / archiviazione: scaricare tutto il lavoro di archiviazione dei file nel modo più ottimale che ci si possa ragionevolmente aspettare.
jamesqf,

17

Il comando filefragti dirà come il tuo file è fisicamente memorizzato sul tuo dispositivo:

# filefrag -v /var/log/messages.1 
Filesystem type is: ef53
File size of /var/log/messages.1 is 41733 (11 blocks, blocksize 4096)
 ext logical physical expected length flags
   0       0  2130567               1 
   1       1 15907576  2130568      1 
   2       2 15910400 15907577      1 
   3       3 15902720 15910401      7 
   4      10  2838546 15902727      1 eof
/var/log/messages.1: 5 extents found

Se scrivi il tuo file in un unico passaggio, suppongo che il tuo file non sarà frammentato.

La pagina man di fallocate(1) è abbastanza chiara:

fallocate viene utilizzato per preallocare i blocchi in un file. Per i filesystem che supportano la fallocatechiamata di sistema, questo viene fatto rapidamente allocando i blocchi e contrassegnandoli come non inizializzati, senza richiedere I / O ai blocchi di dati. Questo è molto più veloce della creazione di un file riempendolo con zeri.

A partire da Linux Kernel v2.6.31, la fallocatechiamata di sistema è supportata dai filesystem btrfs, ext4, ocfs2 e xfs.

È sequenziale? Il sistema tenterà innanzitutto di allocare i blocchi in sequenza. Se non può, non ti avvertirà.


Che cos'è il tipo "ef53". L'ho visto anche sui miei file. Ma il mio tipo di FS è ext4.
hudac,

2
EF53 è il numero "SUPER_MAGIC" di ext2, ext3 ed ext4. Cerca "include / uapi / linux / magic.h" nei sorgenti del kernel per tutti i numeri magici di ogni file system.
Vouze,

Su Debian, filefragè nascosto in /usr/sbin. Ma sembra funzionare per gli utenti ordinari (almeno su ext4). Potrebbe essere istruttivo per il stracesuo funzionamento vedere come misurare la frammentazione per te, se la mancanza di avvertimento ti ostacola.
Toby Speight,

6

Citi file sparsi e nessuna delle altre risposte li ha menzionati.

La maggior parte dei file non è scarsa. Il modo più comune per creare un file è scrivere tutto in una volta, dall'inizio alla fine. Non ci sono buchi lì.

Tuttavia, ti è permesso dire "sposta in posizione 1.000.000.000.000 e scrivi un byte lì". Questo creerà un file che sembra un etabyte grande, ma attualmente utilizza (probabilmente) solo 4k su disco. Questo è un file sparso.

Puoi farlo molte volte per lo stesso file, lasciando piccole quantità di dati sparsi nel vasto vuoto.

Mentre questo può essere utile, ci sono due aspetti negativi.

Il primo è che il file sarà frammentato, il che è ciò di cui ti preoccupi.

Il secondo è che non tutti i programmi gestiscono bene questi file. Ad esempio, alcuni software di backup tenteranno di eseguire il backup del vuoto e quindi creare un backup che è molto più grande del necessario, forse troppo grande per il supporto di backup.


Ma anche un file non sparse spesso non sarà contiguo sul disco.
Barmar,

2

Posso in qualche modo controllare la sequenzialità dei file? Voglio allocare un file di 10 GB. Voglio che sia sequenziale su disco e non diviso tra diversi offset.

Ci sono almeno un paio di modi per raggiungere questo obiettivo.

  1. Utilizzare un filesystem con molto spazio libero e preallocare lo spazio (ad es. Utilizzare un marker di fine dati specifico dell'applicazione e aggiungere dati casuali fino a quando la dimensione del file raggiunge 10 GB). Questo non garantisce risultati non frammentati.

  2. Utilizzare un filesystem non elaborato (crudo) anziché ext4, ecc. I DBMS a volte lo fanno per motivi di prestazioni. Il compromesso è che devi fare il tuo caching / journaling / recupero ecc. Se necessario.

Le circostanze in cui si guadagna molto facendo questo sono relativamente rare: prima vorrei cercare altrove per ottimizzare le prestazioni.


Guarda anche

È vero che i sistemi di gestione dei database in genere ignorano i file system?


-1

Se questa è solo una cosa e non è importante il modo in cui il file viene archiviato originariamente, solo il risultato è importante, quindi puoi semplicemente salvare il file normalmente e quindi eseguire la deframmentazione del tuo sistema operativo. Quindi puoi verificare con questa risposta se il tuo file è in un unico pezzo, in caso contrario, ripetere. Questo è il modo più semplice per farlo, senza usare comandi o programmi esterni, ma non è certamente il metodo più veloce, perché deframmenta l'intero disco.


1
"Esegui la deframmentazione"? Esiste un tale programma? L'unica cosa trovata quando ho cercato aptitude search ~ddefragsono stati ddrescueviewe la nidslibreria di riassemblaggio del segmento TCP. La tua risposta non è molto utile se non dici come si chiama il programma o quali argomenti devono essere passati.
Toby Speight,

1
@TobySpeight - sì, c'è una deframmentazione; e4defrag.
Ravery,
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.