Test de IOPS en Linux con Fio

La necesidad aviva el ingenio o por lo menos eso dicen. La cuestión, en mi día a día me piden realizar diferentes pruebas, ya sea de uso de memoria, CPU o uso disco en los servidores que administro. Ya sabéis las típicas pruebas de Benchmark. Ahí es donde entra la herramienta de la que vamos a hablar hoy llamada Fio, que nos servirá para realizar pruebas de rendimiento de lectura y escritura de disco.

Fio, acrónimo en inglés de «Flexibe I/O Tester«, es una herramienta que genera varios subprocesos o procesos que realizan un tipo específico de acción de Entrada/Salida, según lo especificado por el usuario. Su uso típico es escribir un archivo de trabajo que coincida con la carga de E/S que se desea simular.

Además, si queremos dar una vuelta más, podemos generar gráficas, utilizando en este caso la herramienta fio-plot, para que nuestro estimado responsable fan de las «gráficas en verde y ascendente a la derecha» pueda presumir de ellas.

Imagen generada por IA con indicaciones del autor

Instalación de Fio

Este paquete suele estar en la mayoría de repositorios principales de las distribuciones más populares.

Instalación de Fio en Debian, Ubuntu, LinuxMint y derivadas

sudo apt install fio

Instalación de Fio en RHEL, Rocky Linux, Alma Linux y derivadas

Este paquete se encuentro dentro del repositorio EPEL

sudo yum -y install epel-release
sudo yum -y install fio

Jugando un poco con Fio

El uso de Fio puede ser algo complejo, ya que debemos indicar al detalle lo que queramos que haga, podemos consultar su documentación, como siempre consultando su página de man.

Un ejemplo de uso sería el siguiente:

sudo fio \
--ioengine=libaio \
--direct=1 \
--randrepeat=0 \
--refill_buffers \
--end_fsync=1 \
--filename=$HOME/.fiotest \
--name=fio-read-test \
--rw=read \
--size=1GB \
--bs=1M \
--numjobs=1 \
--iodepth=8 \
--runtime=60

Veamos un poco al detalle lo que hemos hecho:

  • --rw=read En este caso usaremos las pruebas de lectura, pero podemos hacer de escritura u otra: read,write,randread,randwrite,readwrite y randrw
  • --size=1GB Utilizamos un archivo de prueba de 1GB, la cantidad definida debe ser siempre múltiple de 1MB
  • --bs=1MB Definimos el valor máximo de bloque, que debe ser múltiple de 4k
  • --iodepth=1 Para lecturas/escrituras asíncronas, el sistema operativo retornará inmediatamente y la herramienta no necesita esperar a que se complete la operación de E/S. Esta opción establece cuántas operaciones de E/S están en curso o en segundo plano por el sistema operativo. Esta configuración requiere direct=1 y el uso de un motor de E/S asíncrono como libaio.
  • --numjobs=1 Número de trabajos paralelos que generará para la prueba.
  • --runtime=60 Número de segundos durante los cuales se ejecutará la prueba comparativa.
  • --randrepeat=0 Aquí podemos indicar si queremos que «resiembre» el generador aleatorio de forma diferente para cada ejecución
  • --refill_buffers Rellenar los buffers garantiza que los buffers se reescriban y no se almacenen en caché
  • --end_fsync=1 Garantiza que el contenido del archivo se sincronice antes de que finalice el trabajo
  • --direct=1 Utiliza E/S sin buffer

Podemos ver un ejemplo de resultado:

Resultado de utilizar fio más parámetros sobre un Ubuntu 24.04 virtual

Un poco de magia con Fio-plot

Se trata de una herramienta basada en Python que ayuda a ejecutar varios puntos de referencia de Fio y luego visualizar los resultados en varios gráficos.

Instalación de Fio-plot

Antes de nada en nuestro sistema debemos tener instalado la herramienta pip3, de la que ya hemos hablado en la web. Para instalar es así de fácil:

pip3 install fio-plot

Si queremos instalar la herramienta solo para nuestro usuario:

pip3 install --user fio-plot

Instalación en Ubuntu 24.04 con pipx

En Ubuntu 24.04 he tenido que utilizar un método diferente, utilizando pipx, así:

sudo apt update
sudo apt install pipx
pipx ensurepath

Y finalmente:

source ~/.bashrc
pipx install fio-plot
pipx inject fio-plot setuptools

Uso de Fio-plot

A diferencia de Fio, con esta herramienta debemos utilizar un fichero de configuración donde definiremos todos los parámetros.

Para ello creamos un fichero llamado «benchmark.ini», con nuestro editor favorito:

[benchfio]
target = /home/davidochobits/
output = resultados-test
type = directory
mode = read,write,randread,randwrite
size = 1M
iodepth = 1,2,4,8,16,32,64
numjobs = 1,2,4,8,16,32,64
direct = 1
engine = libaio
precondition = False
precondition_repeat = False
runtime = 60
destructive = True
block_size = 1024k

Y ahora, ejecutamos:

bench-fio benchmark.ini

Al lanzarlo nos mostrará esta información:

Generar los gráficos puede ser un poco complejo, para ello he encontrado un magnífico script en bash de ejemplo, en la web de leo.leung.xyz, que he adaptado para mis necesidades:

#!/bin/bash
set -ex
 
FIO_PLOT="/home/davidochobits/.local/bin/fio-plot"
FIO_RESULTS="/home/davidochobits/resultados-test"
 
for type in iops bw lat ; do
        for test in read write randread randwrite ; do
                $FIO_PLOT -i $FIO_RESULTS/1024k/ -r $test \
                        -L -t $type \
                        -T "Filesystem $type / $test (1024k)"   -o results_1024k_$type_$test.png
        done
done

De esta manera, si todo ha ido bien, ya podemos ver los resultados:

Resultados de las pruebas IOPS , en este caso de escritura.

Las posibilidades que ofrecen estas herramientas son muy grandes, os animo a probarlas.

Fuentes consultadas

Página de man de Fio

Página de Fio-plot

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.