El otro día leí el artículo que escriben en PolishLinux sobre la fragmentación de los sistemas de ficheros en Linux y me pareció muy interesante. Poco después leí un post en un blog sobre los comentarios que habían escrito en la propia web de PolishLinux como respuesta al artículo de la fragmentación de los sistemas de ficheros en Linux. Estoy de acuerdo con el autor de este post ya que dice que, aunque no estés de acuerdo con algo … intenta ser útil, pero no te pongas a rabiar por rabiar.
La verdad es que hay gente que:
- no tiene educación
- es muy irrespetuosa
- es poco madura
- no es productiva
En mi opinión, lo peor es lo último: no ser productivo. El que insulten a uno … pues como dice el refrán: «Ande yo caliente …«. Pero que alguien se queje sin ser productivo … eso es muy grave, especialmente en el mundo del softw are libre que se basa en la ayuda, el apoyo y la colaboración de todos. Entre otros comentarios, podemos encontrar este:
We’re very thankful for that and we don’t really need your crappy tools and your BS FUD articles. Seriously. WTF are you thinking??? Any newbie on UbuntuForums could have done a better job at researching the facts before posting this pile of nonsense that you dare to call “article”. Just to make sure you don’t make an idiot of yourself again, you might want to read on FHS (Wikipedia is your friend), you might want to research why “UNIX style” partitioning is a good idea and why one should keep partitions such as /var and /home that get plenty of write-access on separate places than partitions such as /boot, /usr and /opt that mostly get lots of read-access and why this helps a great deal to keep fragmentation down to a minimum. After you have read this stuff you might get an idea why your tools are so totally not needed and why your article is utter nonsense.
Como se puede ver, es un comentario con una base técnica muy fuerte, muy bien redactado e inteligente, vamos que es un derroche de ingenio. Lo mejor es que es muy productivo y ayuda mucho a la Comunidad de Código Abierto … Creo que se nota mi tono irónico.
La gente de PolishLinux no se lo han tomado a mal y decidieron publicar otro artículo en el que explicaban cómo utilizar la herramienta de desfragmentación que viene con ext4.
Como creo que el autor de PolishLinux sí tiene razón, voy a contribuir mi pequeño granito de arena con unos ejemplos muy sencillos, eso sí, con otro sistema de ficheros ;)
Mucha gente sigue pensando que los sistemas de ficheros en Linux no se fragmentan. Esto no es cierto. Sufren de fragmentación, igual que otros sistemas de ficheros. Lo que sí es cierto es que la fragmentación es mucho menor que en otros sistemas de ficheros.
Antes, debemos saber lo que significa fragmentación de un sistema de ficheros. Como explicar lo que es un sistema de no viene a cuento, os dejo con un enlace que lo explica muy bien. Ahora que ya sabéis lo que es un sistema de ficehros, pasemos a la fragmentación.
La fragmentación de un sistema de ficheros no es más que la incapacidad de tener datos relacionados ordenados de forma secuencial en un sistema de ficheros. Es decir, si el fichero 1 y el fichero 2 están relacionados, en un sistema de ficheros fragmentado, 1 y 2 no estarían contiguos. ¿Y esto es malo? Digamos que no es bueno porque si queremos leer el fichero 1 y luego el 2, si no están contiguos, hay que mover los cabezales del disco duro, luego el acceso a los ficheros será más lento.
Este no es el único tipo de fragmentación. Otro tipo de fragmentación ocurre cuando no se puede escribir el fichero entero de forma contigua. Es decir, el fichero se parte y cada parte del fichero se guarda en una zona del disco. El problema aquí reside en que para leer el fichero entero, los cabezales del disco tienen que moverse por el disco duro para localizar todas las partes del fichero. Si las partes del fichero fueran contiguas, no se moverían los cabezales y obtendríamos un mejor rendimiento.
También podemos encontrarnos fragmentación del espacio libre. Esto ocurre cuando el disco duro tiene poco espacio libre y se han ido borrando y creando ficehros. Al haber poco espacio libre en el disco duro, es difícil reservar un espacio para el fichero entero, luego hay que partir el fichero y ocurre lo que hemos visto en el párrafo anterior.
¿Por qué se dice que en Linux no hay fragmentación del sistema de ficheros? En Linux, los sistemas de ficheros se han diseñado (y se siguen diseñando) de forma que se intenta guardar el fichero completo sin tener que fragmentarlo. Obviamente, esto es posible hasta un límite ya que a medida que se va llenando el disco … hay menor probabilidad de que el fichero se pueda escribir entero secuencialmente.
Como lo mejor es ver un ejemplo, vamos allá con XFS, que es el sistema de ficheros que conozco. Además, la gente de PolishLinux ya lo ha demostrado con ext3 y ext4 ;)
Empecemos creándonos un sistema de ficheros:
celeron:~ # mkfs -t xfs -f /dev/sdb1
meta-data=/dev/sdb1 isize=256 agcount=6, agsize=4096 blks
= sectsz=512 attr=0
data = bsize=4096 blocks=24576, imaxpct=25
= sunit=0 swidth=0 blks, unwritten=1
naming =version 2 bsize=4096
log =internal log bsize=4096 blocks=1200, version=1
= sectsz=512 sunit=0 blks, lazy-count=0
realtime =none extsz=4096 blocks=0, rtextents=0
celeron:~ #
Ahora que tenemos el sistema de ficheros, vamos a montarlo:
celeron:~ # mount -t xfs /dev/sdb1 /mnt/
Y comprobamos el tamaño que tiene:
celeron:~ # df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda1 ext3 12G 4.3G 7.0G 39% /
udev tmpfs 253M 100K 252M 1% /dev
/dev/sdb1 xfs 92M 224K 92M 1% /mnt
celeron:~ #
Como podéis ver, me he creado una partición de poco más de 90 MB para el ejemplo ya que así necesito menos ficheros para el ejemplo 0;)
XFS tiene una serie de herramientas que nos permiten administrar sistemas de ficheros XFS. Una de ellas es:
xfs_db
que nos permite, entre otras cosas, ver el estado de fragmentación de un sistema d eficheros. Para poder verlo, tenemos que desmontar el sistema d eficheros primero:
celeron:~ # umount /mnt/
y luego ejecutamos el comando:
celeron:~/demo # xfs_db -c frag /dev/sdb1
actual 0, ideal 0, fragmentation factor 0.00%
celeron:~/demo #
Obviamente, vemos que no hay fragmentación ya que no hay ficheros.
Ahora vamos a montar el sistema de ficheros de nuevo y vamos a copiar una serie de ficheros. Me he creado 9 ficheros de 10 MB cada uno para simplificar el ejemplo:
celeron:~ # cp demo/xa* /mnt/
celeron:~ # ls -lh /mnt/
total 90M
-rw------- 1 root root 10M Jun 3 23:11 xaa
-rw------- 1 root root 10M Jun 3 23:11 xab
-rw------- 1 root root 10M Jun 3 23:11 xac
-rw------- 1 root root 10M Jun 3 23:11 xad
-rw------- 1 root root 10M Jun 3 23:11 xae
-rw------- 1 root root 10M Jun 3 23:11 xaf
-rw------- 1 root root 10M Jun 3 23:11 xag
-rw------- 1 root root 10M Jun 3 23:11 xah
-rw------- 1 root root 10M Jun 3 23:11 xai
celeron:~ #
Si ahora comprobamos el espacio libre:
celeron:~ # df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda1 ext3 12G 4.3G 7.0G 39% /
udev tmpfs 253M 100K 252M 1% /dev
/dev/sdb1 xfs 92M 91M 1.0M 99% /mnt
celeron:~ #
Vemos que efectivamente se han copiado.
Pues nada, vamos a ver si se ha producido fragmentación (recordemos que primero hay que desmontar el sistema de ficheros):
celeron:~/demo # xfs_db -c frag /dev/sdb1
actual 14, ideal 9, fragmentation factor 35.71%
celeron:~/demo #
Vaya, tenemos un 35.71% de fragmentación … Y si ahora borro unos cuantos ficheros:
celeron:~ # mount -t xfs /dev/sdb1 /mnt/
celeron:~ # rm /mnt/xaa /mnt/xah /mnt/xad
celeron:~ # umount /mnt
celeron:~/demo # xfs_db -c frag /dev/sdb1
actual 10, ideal 6, fragmentation factor 40.00%
celeron:~/demo #
Vaya, ha aumentado la fragmentación … Y si ahora copio un fichero de 30 MB:
celeron:~ # mount -t xfs /dev/sdb1 /mnt/
celeron:~ # cp demo/30mb /mnt/
celeron:~ # umount /mnt
celeron:~/demo # xfs_db -c frag /dev/sdb1
actual 15, ideal 7, fragmentation factor 53.33%
celeron:~/demo #
Vaya … ha aumentado aún más … Lógico, he escirto un fichero muy grande en un sistema de ficheros cuyo espacio libre estaba fragmentado, luego se ha fragmentado el fichero para poder guardarse en el disco.
Este ejemplo que he puesto es muy exagerado ya que he usado una partición muy pequeña. Esto está hecho a propósito para que se pueda ver fácil. Obviamente en un disco de 1 TB de hoy en día, es más difícil de ver este comportaminto ya que hay mucho más espacio y la probabilidad de guardar un fichero secuencialmente (o, dicho de otra manera, que todos sus bloques sean contiguos) es mucho mayor. Claro .. que a medida que se vaya llenando el disco, la probabilidad de que haya fragmentación es mayor.
Bueno, pero ¿esto tiene solución? Sí, otra de las herramientas que tiene XFS es un defragmentador: xfs_fsr
. Para que xfs_fsr
funcione, debe tener suficiente espacio para poder mover los ficheros, obviamente. De lo contrario obtendremos un error como este:
celeron:~ # xfs_fsr -v /mnt/
/mnt start inode=0
ino=131
insufficient freespace for: ino=131: size=31457280: ignoring
ino=139
insufficient freespace for: ino=139: size=10485760: ignoring
ino=137
insufficient freespace for: ino=137: size=10485760: ignoring
celeron:~ #
Si hay espacio en disco, obtendremos algo similar a esto:
celeron:~ # xfs_fsr -v /mnt/
/mnt start inode=0
ino=137
extents before:2 after:1 DONE ino=137
ino=139
extents before:2 after:1 DONE ino=139
celeron:~ #
Si comprobamos la fragmentación del sistema de ficheros:
celeron:~/demo # xfs_db -c frag /dev/sdb1
actual 4, ideal 4, fragmentation factor 0.00%
celeron:~ #
Como podemos ver, los sistemas de ficheros en Linux sí se fragmentan. Espero que hayáis encontrado el post de hoy interesante. ¿Hay que preocuparse? Yo creo que no demasiado