Contact me sending an e-mail (antispam defense activated) |
Title: Deframmentazione di un filesystem Author: Sandro Tosi Last modified: 2004-11-14 (2004-11-07) (2004-10-31) (2004-10-06) (18/07/2004) La frammentazione avviene quando il sistema non riesce ad allocare uno spazio contiguo sul disco sufficiente a contenere interamente un file in una singola locazione. Quando succede, il file deve essere separato in due o piu` pezzi che sono scritti in diversi posti del disco ed il filesystem deve mantenere una struttura per tener traccia di dove sono memorizzati questi frammenti. All'aumentare del numero di frammenti, la velocita` di lettura di un file diminuisce, in quanto e` necessario leggere continuamente le strutture di indicizzazione dei file e spostare la testina in parti diversi del disco. Quella appena descritta e` la frammentazione esterna, a cui solitamente ci si riferisce. Esiste pero` anche la frammentazione interna. Dal momento che il blocco e` l'unita di allocazione base, ogni file utilizzera` almeno un blocco. Se un file ha dimensione inferiore a quella di un blocco, o se un file e` molto grande e la sua dimensione non e` un multiplo della dimensione dei blocchi, il sistema deve allocare un blocco non completamente pieno, causando uno spreco di spazio. Questo spreco e` la frammentazione interna, a cui non c'e` soluzione: puo` essere arginata riducendo la dimensione dei blocchi, ma questo puo` impattare sulle performance. Reduci dai macelli di Windows, ci si puo` chiedere se il filesystem di Linux (ext2/3, per gli altri il discorso diventa troppo ampio, ma rimane sostanzialmente valido) abbia bisogno di essere deframmentato. Beh, la risposta e` no: il filesystem di Linux e` studiato appositamente per ridurre il processo di frammentazione (eliminarlo e` praticamente impossibile) e quindi il problema ha un impatto molto minore che sotto i sistemi Windows. Quando deve essere scritto un file, Linux cerca uno spazio libero contiguo sufficiente a contenerlo; se non lo trova, cerchera` allora i due piu` grandi blocchi libero in grado di contenere questo file, e cosi` via, sempre cercando di mantenere il numero di frammenti il minore possibile. Statisticamente, in presenza di continue creazioni e cancellazioni di file, questo metodo funziona; risulta invece scarsamente efficiente in presenza di partizioni molto occupate (oltre il 90%), in quanto non e` sempre facile trovare spazio libero contiguo. Inoltre, viene anche utilizzata la tecnica della ``preallocazione'': per i file normali vengono riservati dei blocchi prima che siano effettivamente necessari; quando il file aumentera` di spazio, diversi blocchi adiacenti saranno gia` disponibili. Per conoscere la percentuale di frammentazione di un fs, si esegua # fsck <filesystem> che restituira`, tra le altre informazioni, anche la voce ``non-contiguous'' ed un valore in percentuale: quella e` la percentuale di frammentazione del filesystem esaminato. Probabilmente, non esiste nemmeno uno strumento apposito per eseguire la deframmentazione di un fs, in quanto la pratica comune e` quella di salvare l'intero contenuto del fs da deframmentare da un altra parte, formattare il fs, e ricopiare i dati sopra. Naturalmente, una buona strategia di partizionamento dello spazio disco consente di ridurre ancora di piu` il problema: parti del sistema che tendono a non cambiare, come /usr (che solitamente contiene i programmi), possono essere messe in partizioni separate, che saranno dunque a bassa frammentazione; se l'utilizzo del sistema e` per file-, mail-, news- oppure database-server, le directory che contengono quei dati saranno ad alta frammentazione. Nota: non tutti i fs sono esenti da frammentazione, per esempio JFS soffre di questo problema. |