systemadmin.es > Storage > Sistemas de ficheros > filefrag: Ver la fragmentación de un fichero

filefrag: Ver la fragmentación de un fichero

Al tratar un fichero puede fragmentarse, por lo que el rendimiento al acceder se deteriora. Vamos a ver como utilizar filefrag en sistema de ficheros ext (ext2, ext3 y ext4) para detectar la fragemtación de un fichero.

Su uso es muy simple, sólo deberemos pasarle un fichero y nos indicará si el número de extents que usa es el optimo o por el contrario el numero que esta usando y cual es el número que debería usar. Por ejemplo, para el caso de un fichero no fragmentado obtendríamos:

# filefrag nofragmentado
nofragmentado: 1 extent found

En el caso que el fichero este fragmentado obtendríamos:

# filefrag fragmentado
fragmentado: 2 extents found, perfection would be 1 extent

En el caso que encontremos un fichero fragmentado, no tenemos para ni para ext2 ni para ext3 ninguna herramienta disponible para desfragmentarlo por lo que la única opción es copiar el fichero con otro nombre, por ejemplo:

# filefrag stats_1185.ibd
stats_1185.ibd: 2 extents found, perfection would be 1 extent
# cp stats_1185.ibd stats_1185.ibd.2
# filefrag stats_1185.ibd.2
stats_1185.ibd.2: 1 extent found

Una vez copiado el fichero solo nos queda borrar el fragmentado y cambiar de nombre el nuevo:

# rm stats_1185.ibd
# mv stats_1185.ibd.2 stats_1185.ibd

En el caso que veamos que ni siquiera copiando el fichero se elimina la fragmentación:

# filefrag mysql.slow.log
mysql.slow.log: 6 extents found, perfection would be 1 extent
# cp mysql.slow.log mysql.slow.log.2
# filefrag mysql.slow.log.2
mysql.slow.log.2: 3 extents found, perfection would be 1 extent

Entonces el sistema de ficheros esta muy fragmentado, por lo que para arreglar-lo deberíamos ver si es posible eliminar contenido para liberar extents, desfragmentar todos los ficheros uno a uno y con varias pasadas jugando con el espacio que quede libre o bien, simplemente, crear un nuevo sistema de ficheros y copiar todos los datos allí.

Mediante el verbose (opción -v) de filefrag podemos obtener más detalles sobre cómo esta la fragmentación de un cierto fichero y ciertos parámetros relacionados con ella (por ejemplo el tamaño de bloque):

# filefrag -v mysql.slow.log
Checking mysql.slow.log
Filesystem type is: ef53
Filesystem cylinder groups is approximately 70
Blocksize of file mysql.slow.log is 4096
File size of mysql.slow.log is 401355 (98 blocks)
First block: 1011728
Last block: 1012161
Discontinuity: Block 1 is at 1011737 (was 1011728)
Discontinuity: Block 2 is at 1011741 (was 1011737)
Discontinuity: Block 6 is at 1011747 (was 1011744)
Discontinuity: Block 12 is at 1011924 (was 1011753)
Discontinuity: Block 19 is at 1012083 (was 1011930)
mysql.slow.log: 6 extents found, perfection would be 1 extent

3 comments to “filefrag: Ver la fragmentación de un fichero”

  1. Aquí hay un script escrito en Perl para ver la fragmentación del sistema de archivos:
    http://forums.gentoo.org/viewtopic-t-429915.html
    Y aquí hay otro para desfragmentar el sistema de archivos:
    http://ck.kolivas.org/apps/defrag/defrag-0.06/defrag

  2. Muy interesantes!

    El primero computa la suma total de la fragmentación de los ficheros usando filefrag y el segundo sólo copia los ficheros de nuevo por orden teniendo en cuenta el tamaño, siendo poco práctico. Estaría bien que el defrag se pudiese hacer en caliente.

  3. El primer script del post de Peter dará un resultado engañoso, porque no muestra el grado de fragmentación en el disco o una medida de la fragmentación de los archivos, en su lugar muestra un porcentaje de los archivos fragmentados.
    Así por ejemplo un archivo fragmentado muy grande valdrá lo mismo que uno pequeño defragmentado, o por ejemplo un archivo muy muy fragmentado valdrá lo mismo que el no fragmentado. El resultado mostrará grados de “fragmentación” muy por debajo al real.

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>