Cómo desfragmentar un sistema de archivos XFS

Cómo desfragmentar un sistema de archivos XFS
La fragmentación es un problema de larga data cuando se trata de almacenamiento. Surge cuando, debido al uso prolongado, los medios de almacenamiento obtienen trozos de bloques asignados con espacio libre entre ellos. Esto sucede porque varios programas solicitan memoria en un orden diferente y luego liberan la memoria en diferentes momentos. Tener fragmentos de espacio no asignado entre datos reduce el espacio total disponible en el disco (eficiencia de almacenamiento) y también el rendimiento del disco, ya que los datos no se almacenan en una gran parte contigua, sino que se extienden por el disco.

Este problema es especialmente evidente en los medios magnéticos, aunque los SSD también lo sufren. Intentemos desfragmentar un sistema de archivos XFS en esta publicación.

Configuración de sandbox

Primero, para experimentar con el sistema de archivos XFS, decidí crear un banco de prueba en lugar de trabajar con datos críticos en un disco. Este banco de pruebas se compone de una VM ubuntu a la que se conecta un disco virtual que proporciona almacenamiento en bruto. Puede usar VirtualBox para crear la VM y luego crear un disco adicional para adjuntar a la VM

Simplemente vaya a la configuración de su VM y debajo Configuración → Almacenamiento Sección Puede agregar un nuevo disco al controlador SATA Puede crear un nuevo disco. Como se muestra a continuación, pero asegúrese de que su VM esté apagada cuando haga esto.

Una vez que se crea el nuevo disco, encienda la VM y abra el terminal. El comando lsblk Enumera todos los dispositivos de bloque disponibles.

$ lsblk
SDA 8: 0 0 60g 0 disco
├─Sda1 8: 1 0 1M 0 Part
└─Sda2 8: 2 0 60g 0 parte /
SDB 8:16 0 100G 0 Disco
SR0 11: 0 1 1024m 0 ROM

Aparte del dispositivo de bloque principal SDA, Donde se instala el sistema operativo, ahora hay un nuevo dispositivo SDB. Creemos rápidamente una partición a partir de ella y la formaticemos con el sistema de archivos XFS.

Abra la utilidad separada como usuario root:

$ separado -A óptimo /dev /sdb

Creemos una tabla de partición primero usando Mklabel, esto se sigue creando una sola partición fuera del disco (que tiene un tamaño de 107 GB). Puede verificar que la partición se realice enumerándola usando el comando de impresión:

(separado) mklabel gpt
(separado) MKPART primario 0 107
(separado) Imprimir
(separado) Salir

De acuerdo, ahora podemos ver el uso de LSBLK que hay un nuevo dispositivo de bloque debajo del dispositivo SDB, llamado SDB1.

Formaticemos este almacenamiento como XFS y montelo en el directorio en /mnt. Nuevamente, haga las siguientes acciones como root:

$ MKFS.xfs /dev /sdb1
$ MONTO /DEV /SDB1 /MNT
$ DF -H

El último comando imprimirá todos los sistemas de archivos montados y puede verificar que /dev /sdb1 esté montado en /mnt.

A continuación, escribimos un montón de archivos como datos ficticios para desfragmentar aquí:

$ dd if =/dev/urandom of =/mnt/myfile.TXT Count = 1024 BS = 1024

El comando anterior escribiría un archivo myfile.Txt de tamaño de 1 MB. Puede automaticar este comando en un bucle simple para bucle usando bash y generar más archivos de este tipo. Difundirlos en varios directorios si desea. Elimine algunos de ellos al azar. Haga todo esto dentro del sistema de archivos XFS (montado en /mnt) y luego verifique la fragmentación. Todo esto es, por supuesto, opcional.

Desfragmenta su sistema de archivos

Lo primero que debemos hacer es descubrir cómo verificar la cantidad de fragmentación. Por ejemplo, el sistema de archivos XFS que creamos anteriormente estaba en el nodo del dispositivo /dev /sdb. Podemos usar la utilidad XFS_DB (representa la depuración de XFS) para verificar el nivel de fragmentación.

$ xfs_db -c frag -r /dev /sdb1

La bandera -c toma varios comandos entre los cuales se encuentra el comando Frag para verificar el nivel de fragmentación. El indicador -r utilizado para asegurarse de que la operación sea completamente de solo lectura.

Si encontramos que hay alguna fragmentación en este sistema de archivos, ejecutamos el comando xfs_fsr en el nodo del dispositivo:

$ xfs_fsr /dev /sdb1

Este último comando es todo lo que hay para desfragmentar su sistema de archivos, puede agregar esto como un cronjob que monitoreará regularmente su sistema de archivos. Pero hacer eso para XFS tiene poco sentido. La asignación basada en la extensión de XFS garantiza que problemas como la fragmentación permanezcan al mínimo.

Casos de uso

Los casos de uso en los que debe preocuparse más por la fragmentación del sistema de archivos involucra aplicaciones donde se escriben y reescriben una gran cantidad de pequeños fragmentos de datos. Una base de datos es un ejemplo clásico de esto y las bases de datos son conocidas por dejar muchos y lotes de "agujeros" en su almacenamiento. Los bloques de memoria no se llenan contiguamente, lo que hace que la cantidad de espacio disponible sea cada vez más pequeño con el tiempo.

El problema surge no solo en términos de espacio reducido utilizable sino también en términos de IOPs reducidos que podrían dañar el rendimiento de su aplicación. Tener un script para monitorear continuamente el nivel de fragmentación es una forma conservadora de mantener el sistema. No desea que un script automatizado comience al azar desfragmentando su sistema de archivos, especialmente cuando se usa en la carga máxima.