Questo problema è particolarmente evidente nei supporti magnetici, anche se ne soffrono anche gli SSD. Proviamo a deframmentare un file system XFS in questo post.
Configurazione sandbox
Innanzitutto, per sperimentare con il filesystem XFS, ho deciso di creare un banco di prova invece di lavorare con dati critici su un disco. Questo banco di prova è costituito da una macchina virtuale Ubuntu a cui è connesso un disco virtuale che fornisce spazio di archiviazione non elaborato. Puoi usare VirtualBox per creare la VM e quindi creare un disco aggiuntivo da collegare alla VM
Vai alle impostazioni della tua VM e sotto Impostazioni → Memoria sezione puoi aggiungere un nuovo disco al controller SATA puoi creare un nuovo disco. Come mostrato di seguito, ma assicurati che la tua VM sia spenta quando lo fai.
Una volta creato il nuovo disco, accendi la VM e apri il terminale. Il comando lsblk elenca tutti i dispositivi a blocchi disponibili.
$ lsblksda 8:0 0 60G 0 disco
├─sda1 8:1 0 1M 0 parte
└─sda2 8:2 0 60G 0 parte /
sdb 8:16 0 100G 0 disco
sr0 11:0 1 1024M 0 rom
A parte il dispositivo di blocco principale sda, dove è installato il sistema operativo, ora c'è un nuovo dispositivo sdb. Creiamo rapidamente una partizione da essa e formattiamola con il filesystem XFS.
Apri l'utilità parted come utente root:
$ parted -a ottimale /dev/sdbCreiamo prima una tabella delle partizioni usando mklabel, seguito dalla creazione di una singola partizione dall'intero disco (che ha una dimensione di 107 GB). Puoi verificare che la partizione sia stata creata elencandola usando il comando print:
(parted) mklabel gpt(parted) mkpart primary 0 107
(parted) stampa
(separato) esci
Ok, ora possiamo vedere usando lsblk che c'è un nuovo dispositivo a blocchi sotto il dispositivo sdb, chiamato sdb1.
Formattiamo questa memoria come xfs e montiamola nella directory /mnt. Ancora una volta, esegui le seguenti azioni come root:
$ mkfs.xfs /dev/sdb1$ mount /dev/sdb1 /mnt
$ df -h
L'ultimo comando stamperà tutti i filesystem montati e puoi controllare che /dev/sdb1 sia montato su /mnt.
Quindi scriviamo un mucchio di file come dati fittizi da deframmentare qui:
$ dd if=/dev/urandom of=/mnt/myfile.txt conteggio=1024 bs=1024Il comando precedente scriverebbe un file miofile.txt di 1 MB di dimensione. Puoi automatizzare questo comando in un semplice ciclo for usando bash e generare più file di questo tipo. Diffondili in varie directory, se lo desideri. Eliminane alcuni a caso. Fai tutto questo all'interno del filesystem xfs (montato su /mnt) e poi controlla la frammentazione. Tutto questo è, ovviamente, facoltativo.
Deframmenta il tuo filesystem
La prima cosa che dobbiamo fare è capire come controllare la quantità di frammentazione. Ad esempio, il filesystem xfs che abbiamo creato in precedenza era sul nodo del dispositivo /dev/sdb. Possiamo usare l'utility xfs_db (sta per xfs debugging) per controllare il livello di frammentazione.
$ xfs_db -c frag -r /dev/sdb1Il flag -c accetta vari comandi tra cui il comando frag per controllare il livello di frammentazione. Il flag -r utilizzato per assicurarsi che l'operazione sia interamente di sola lettura.
Se troviamo che c'è qualche frammentazione in questo filesystem, eseguiamo il comando xfs_fsr sul nodo del dispositivo:
$ xfs_fsr /dev/sdb1Questo ultimo comando è tutto ciò che serve per deframmentare il tuo filesystem, puoi aggiungerlo come cronjob che controllerà regolarmente il tuo filesystem. Ma farlo per xfs ha poco senso. L'allocazione basata sull'estensione di XFS garantisce che problemi come la frammentazione rimangano al minimo.
Casi d'uso
I casi d'uso in cui devi preoccuparti di più della frammentazione del filesystem coinvolgono applicazioni in cui vengono scritti e riscritti molti piccoli blocchi di dati. Un database è un classico esempio di ciò e i database sono noti per lasciare molti, molti "buchi" nel tuo spazio di archiviazione. I blocchi di memoria non vengono riempiti in modo contiguo, rendendo la quantità di spazio disponibile sempre più piccola nel tempo.
Il problema si pone non solo in termini di spazio utilizzabile ridotto, ma anche in termini di IOPS ridotti che potrebbero danneggiare le prestazioni dell'applicazione. Avere uno script per monitorare continuamente il livello di frammentazione è un modo conservativo di mantenere il sistema. Non vuoi che uno script automatico inizi a deframmentare in modo casuale il tuo filesystem, specialmente quando viene utilizzato al picco di carico.