Sep 27, 2009

File system benchmark en Linux

En el presente artículo vamos a analizar distintas herramientas que se tienen en Linux para hacer pruebas de rendimiento sobre un sistema de almacenamiento.

Esta clase de aplicaciones pueden llegar a ser muy interesantes cuando se quiere medir el rendimiento o alcance de un determinado sistema de archivos (ext4, ext3, NTFS, GFS, etc.) o una clase concreta de acceso a datos (NFS, GNBD, iSCSI, etc.), obteniendo información como la velocidad de escritura, lectura, latencias, etc.

Por ejemplo, se puede tener la necesidad de montar un espacio de almacenamiento en red al que accedan concurrentemente múltiples servidores, y en una primera etapa de evaluación se planteen dos posibles escenarios: acceso mediante NFS a un sistema de ficheros ext3 o GFS2.

cp

Comando utilizado para copiar archivos desde un origen a un destino. La siguiente orden lo que hará será medir el tiempo empleado en escribir un determinado fichero de XXXX · YYYY bytes en disco (directorio /tmp).
# dd if=/dev/zero of=file bs=XXXX count=YYYY && time cp file /mnt/tmp

Una forma habitual de uso del comando cp puede ser por ejemplo transferir el directorio /etc (122 MB, 1999 archivos) o /lib (207 MB, 3746 archivos). De esta forma se consigue el copiado de múltiples ficheros de diferentes tamaños, los cuales se encuentran ubicados en distintos subdirectorios.

dd

Permite el copiado de datos bit a bit independientemente del sistema de ficheros origen y destino. Como información de salida ofrece la velocidad de lectura/escritura con la que se ha realizado la operación, así como el tiempo empleado.

El formato que utilizaremos para el comando dd será el siguiente:

  • Lectura de XXXX · YYYY bytes desde el disco /dev/sda al dispositivo /dev/null.
    # dd if=/dev/sda of=/dev/null bs=XXXX count=YYYY
  • Escritura de XXXX · YYYY bytes desde el dispositivo origen /dev/zero al fichero /tmp/output.
    # dd if=/dev/zero of=/tmp/output bs=XXXX count=YYYY
El dispositivo /dev/null descarta toda la información volcada en él de forma instantánea. De esta forma, al aplicar el primer comando el tiempo de cómputo se invertirá exclusivamente en la lectura de datos.

Decir que /dev/zero es un dispositivo especial que cuando se lee de él proporciona caracteres NULL, es decir, su tiempo de lectura es prácticamente nulo. De esta forma, al aplicar el segundo comando el tiempo de cómputo se invertirá exclusivamente en la escritura de datos.

Una forma habitual de uso de dd es por ejemplo leer y escribir un fichero superior a la memoria RAM total (por ejemplo 5 GB en caso de disponer de 4 GB de memoria RAM). Esa transferencia se realizará seis veces, tanto en lectura (R) como en escritura (W). Se irá variando los valores de XXXX e YYYY de tal forma que su multiplicación dé 5 GB. De esta forma mediremos la tasa de transferencia y el tiempo empleado.
bs (bytes)  count  velocidad-R (MB/sg)  tiempo-R (sg)   velocidad-W (MB/sg)  tiempo-W (sg)
65536 78125
131072 39062
262144 19531
524288 9765
1048576 4882
2097152 2441

Con bs igual a 65536 se emplearán registros de 64 KB para hacer las transferencias.

IOzone

IOzone es una herramienta de benchmark destinada a comprobar el rendimiento de un sistema de archivos. La aplicación genera y mide una gran cantidad de operaciones sobre ficheros. La forma de ejecutar IOzone es la siguiente:

# iozone [options] > logfile

IOzone dispone de distintas opciones para poder pasar por la línea de órdenes; a continuación vamos a exponer las más interesantes de cara a medir el rendimiento de un sistema de archivos:
  • -a: modo automático completo.
  • -b excel_file: genera un archivo en formato Excel con los resultados obtenidos (formato binario).
  • -c: incluye en los resultados los tiempos empleados para cerrar los ficheros.
  • -f filename: especifica el archivo temporal que se empleará para los tests.
  • -g size: tamaño máximo del archivo (Ej. -g 2G, igual o superior al tamaño de la memoria RAM) para el modo auto (-a).
  • -i test: especifica el tipo de test a utilizar (0: escritura/re-escritura, 1: lectura/re-lectura, 2: lectura/escritura aleatoria, ...).
  • -l num: número mínimo de procesos.
  • -r size: tamaño fijo del registro utilizado para hacer las transferencias.
  • -s size: tamaño fijo del archivo utilizado para hacer las transferencias.
  • -u num: número máximo de procesos.
  • -z: esta opción utilizada junto con el parámetro -a, fuerza a IOzone a emplear archivos pequeños durante las pruebas.
  • -F filename1 filename2 ...: especifica los archivos temporales que se emplearán para los tests.
  • -R: genera un informe Excel.
  • -U mountpoint: punto de montaje a desmontar y montar durante el transcurso de los tests.

Las distintas definiciones de los tests son las siguientes:

  • Escritura: mide el rendimiento de escritura secuencial en un nuevo archivo.
  • Re-escritura: mide el rendimiento de escritura secuencial sobre un archivo que ya existe.
  • Lectura: mide el rendimiento de lectura secuencial sobre un archivo existente.
  • Re-lectura: mide el rendimiento de lectura secuencial sobre un archivo que ha sido recientemente leído.
  • Escritura aleatoria: mide el rendimiento de escritura aleatoria en un nuevo archivo.
  • Lectura aleatoria: mide el rendimiento de lectura aleatoria sobre un archivo ya existente.
Una forma habitual de uso de IOzone puede ser la siguiente:
# iozone -Razc -i 0 -i 1 -g 4G -f /mnt/tmp/file -b fichero.xls

La orden anterior ejecuta un test de lectura/escritura secuencial, variando los tamaños de los ficheros empleados desde 64 KB a 4 GB, utilizando buffers de transferencia comprendidos entre 4 KB y 16 MB. Como resultado final se generará un fichero Excel a partir del cual podremos crear las correspondientes gráficas.

Esto último es lo que se conoce como barrido de un determinado espectro de almacenamiento, y tiene como principal objetivo el de poder generar una gráfica de superficie que determine el comportamiento del sistema ante variaciones de los registros y ficheros empleados.

Para este caso le hemos indicado a iozone que utilice el fichero file, el cual deberá encontrarse sobre el sistema de archivos que queremos comprobar, siendo en este caso /mnt/tmp.

En esta clase de pruebas es conveniente utilizar un tamaño de fichero máximo (parámetro -g) superior a la memoria RAM disponible. De esta forma se podrá obtener el comportamiento de la máquina cuando utiliza la memoria cache del procesador (tamaño del archivo inferior a la cache del procesador), cuando emplea la memoria RAM (tamaño del archivo comprendido entre la cache del procesador y la cantidad total de memoria RAM) o cuando hace uso directamente de las operaciones de entrada/salida a disco (tamaño del archivo superior a la memoria RAM).

Otra forma habitual de empleo de IOzone está destinada a medir el impacto de diferente número de procesos sobre dicho sistema de archivos. Por ejemplo, la orden siguiente hará que varios procesos (desde 1 a 50) vayan realizando operaciones de lectura/escritura secuencial de un fichero de 4 MB, utilizando para ello registros de 64 KB.
[... tmp]# iozone -Rc -r 64 -s 4MB -l 1 -u 50 -i 0 -i 1 -b /root/fichero.xls

A diferencia del caso anterior, esta vez nos hemos situado sobre el directorio a testear (sistema de archivos), ya que de esta forma cada uno de los procesos que lance IOzone irá creando su fichero temporal correspondiente. Otra alternativa hubiera sido no ubicarse en dicho directorio y a través de la opción -F indicar los diferentes ficheros a utilizar, uno por cada proceso implicado, es decir, en nuestro caso hasta un total de 50 ficheros deberían haberse definido con la opción -F.

El ejemplo anterior se suele utilizar para obtener el comportamiento de múltiples procesos del sistema manejando archivos pequeños. Para completar las pruebas de IOzone es conveniente repetir este test pero utilizando archivos más grandes (y aumentando a su vez el tamaño de los registros).
[... tmp]# iozone -Rc -r 1024 -s 512MB -l 1 -u 12 -i 0 -i 1 -b /root/fichero.xls

Bonnie++

Bonnie++ es un programa utilizado para comprobar el rendimiento de discos duros y sistemas de archivos. Bonnie++ permite la creación de distintos tests de lectura, escritura y borrado de archivos de diversos tamaños, etc. Bonnie++ tiene muchos parámetros que pueden ser empleados, pero la forma en la que lo utilizaremos para medir el rendimiento de un sistema de ficheros será la siguiente:
# bonnie++ -d /tmp [-n number:max:min:num-directories] [-s size] -u 0

A través de la opción -d se especifica el directorio a utilizar durante el transcurso de las pruebas. El parámetro number es el número de archivos que serán creados multiplicado por 1024, el cual vendrá precedido de la opción -n. Si se especifican los valores max y min, los archivos serán creados con un tamaño aleatorio comprendido entre esas dos cotas (bytes). Y si de declara el parámetro directories, los archivos serán distribuidos uniformemente a través de una estructura de directorios con una profundidad máxima marcada por el parámetro directories.

Con la opción -s se indica a través del valor size, el tamaño del archivo que será utilizado para las pruebas de lectura y escritura. Este tamaño debe ser como mínimo el doble de la memoria RAM. Y con la opción -u 0 se indica a Bonnie++ que ejecute las pruebas como usuario root.

Los resultados mostrados por Bonnie++ ofrecen velocidades de escritura secuencial (Sequential Output) y lectura secuencial (Sequential Input). También ofrecen valores sobre la creación secuencial (Sequential Create) y aleatoria (Random Create) de ficheros, así como de borrado secuencial (Sequential Delete) y aleatorio (Random Delete) de ficheros.

Bonnie++ trae consigo una herramienta que nos permite generar un fichero en formato HTML (bon_csv2html) a partir de los resultados obtenidos (última línea de datos). Para ello deberemos ejecutar la siguiente secuencia de órdenes:
# echo "última_línea_de_datos"  bon_csv2html > fichero.html

Una forma habitual de uso de Bonnie++ puede ser la siguiente:
# bonnie++ -n 128 -s 7544 -x 1 -u 0 -d /mnt/tmp/

La orden anterior ejecuta una sola vez (-x 1), un test de lectura y escritura de un archivo de 7,5 GB, así como la tarea de creación y borrado de 131072 ficheros (128x1024) de 0 bytes.

Por último, decir que es importante limpiar los datos cacheados en la memoria RAM al terminar cada una de las pruebas.

1 comment: