Comparar el rendimiento del disco persistente en una VM de Linux


Para comparar el rendimiento del disco persistente, usa el verificador de E/S flexible (FIO) en lugar de otras herramientas de comparativas de discos, como dd. De forma predeterminada, dd usa una profundidad de cola de E/S muy baja, por lo que es difícil garantizar que la comparativa genere una cantidad suficiente de E/S y bytes para probar con precisión el rendimiento del disco.

Además, los dispositivos especiales que se usan con dd suelen ser muy lentos y no reflejan con precisión el rendimiento del disco persistente. En general, evita usar dispositivos especiales como /dev/urandom, /dev/random y /dev/zero en tus comparativas de rendimiento de discos persistentes.

Para medir las IOPS y la capacidad de procesamiento de un disco que está en uso en una instancia en ejecución, compara el sistema de archivos con su configuración deseada. Usa esta opción para probar una carga de trabajo realista sin perder el contenido de tu disco existente. Ten en cuenta que, cuando realizas un análisis comparativo del sistema de archivos en un disco existente, hay muchos factores específicos del entorno de desarrollo que pueden afectar los resultados, y es posible que no alcances los límites de rendimiento del disco.

Para medir el rendimiento sin procesar de un disco persistente, compara el dispositivo de bloques directamente. Usa esta opción para comparar el rendimiento del disco sin procesar con los límites de rendimiento del disco.

Los siguientes comandos funcionan con los sistemas operativos Debian o Ubuntu con el administrador de paquetes apt.

Compara las IOPS y la capacidad de procesamiento de un disco en una instancia en ejecución

Si deseas medir las IOPS y la capacidad de procesamiento para una carga de trabajo realista en un disco activo de una instancia en ejecución sin perder el contenido del disco, realiza la comparación con un directorio nuevo en el sistema de archivos existente. Cada prueba fio se ejecuta durante cinco minutos.

  1. Conéctate a tu instancia

  2. Instale las dependencias:

    sudo apt update
    sudo apt install -y fio
    
  3. En la terminal, enumera los discos adjuntos a tu VM y busca el disco que deseas probar. Si tu disco persistente aún no tiene formato, dale formato y actívalo.

    sudo lsblk
    
    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda      8:0    0   10G  0 disk
    └─sda1   8:1    0   10G  0 part /
    sdb      8:32   0  2.5T  0 disk /mnt/disks/mnt_dir
    

    En este ejemplo, probamos un disco persistente SSD de 2,500 GB con el ID de dispositivo sdb.

  4. Crea un directorio nuevo, fiotest, en el disco. En este ejemplo, el disco se activa en /mnt/disks/mnt_dir:

    TEST_DIR=/mnt/disks/mnt_dir/fiotest
    sudo mkdir -p $TEST_DIR
    
  5. Prueba la capacidad de procesamiento de escritura mediante la realización de operaciones de escritura secuenciales con varias transmisiones paralelas (más de 16) mediante el uso de un tamaño de bloque de E/S de 1 MB y una profundidad de E/S de al menos 64:

    sudo fio --name=write_throughput --directory=$TEST_DIR --numjobs=16 \
    --size=10G --time_based --runtime=5m --ramp_time=2s --ioengine=libaio \
    --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
    --group_reporting=1 --iodepth_batch_submit=64 \
    --iodepth_batch_complete_max=64
    
  6. Prueba las IOPS de escritura mediante la realización de operaciones de escritura aleatorias, con un tamaño de bloque de E/S de 4 KB y una profundidad de E/S de al menos 256:

     sudo fio --name=write_iops --directory=$TEST_DIR --size=10G \
    --time_based --runtime=5m --ramp_time=2s --ioengine=libaio --direct=1 \
    --verify=0 --bs=4K --iodepth=256 --rw=randwrite --group_reporting=1  \
    --iodepth_batch_submit=256  --iodepth_batch_complete_max=256
    
  7. Prueba la capacidad de procesamiento de lectura mediante la realización de operaciones lecturas secuenciales con varias transmisiones paralelas (más de 16), con un tamaño de bloque de E/S de 1 MB y una profundidad de E/S de al menos 64:

    sudo fio --name=read_throughput --directory=$TEST_DIR --numjobs=16 \
    --size=10G --time_based --runtime=5m --ramp_time=2s --ioengine=libaio \
    --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
    --group_reporting=1 \
    --iodepth_batch_submit=64 --iodepth_batch_complete_max=64
    
  8. Prueba las IOPS de lectura mediante la realización de operaciones de lecturas aleatorias, con un tamaño de bloque de E/S de 4 KB y una profundidad de E/S de al menos 256:

    sudo fio --name=read_iops --directory=$TEST_DIR --size=10G \
    --time_based --runtime=5m --ramp_time=2s --ioengine=libaio --direct=1 \
    --verify=0 --bs=4K --iodepth=256 --rw=randread --group_reporting=1 \
    --iodepth_batch_submit=256  --iodepth_batch_complete_max=256
    
  9. Limpieza:

    sudo rm $TEST_DIR/write* $TEST_DIR/read*
    

Compara el rendimiento del disco persistente sin procesar

Si deseas medir solo el rendimiento de los discos persistentes fuera de tu entorno de desarrollo, prueba el rendimiento de lectura y escritura para un dispositivo de bloques en un disco persistente y una VM desechables. Cada prueba fio se ejecuta durante cinco minutos.

Los siguientes comandos suponen que hay un disco persistente SSD de 2,500 GB adjunto a tu VM. Si el tamaño de tu dispositivo es diferente, modifica el valor del argumento --filesize. Este tamaño de disco es necesario para alcanzar los límites de capacidad de procesamiento de VM de 32 CPU virtuales. Para obtener más información, consulta Rendimiento del almacenamiento en bloque.

  1. Conéctate a tu instancia

  2. Instala las dependencias:

    sudo apt-get update
    sudo apt-get install -y fio
    
  3. Llena el disco con datos distintos de cero. Las operaciones de lectura de disco persistente de bloques vacíos tienen un perfil de latencia diferente del de los bloques que contienen datos. Recomendamos llenar el disco antes de ejecutar una evaluación comparativa de latencia de operaciones de lectura.

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    sudo fio --name=fill_disk \
      --filename=/dev/sdb --filesize=2500G \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=128K --iodepth=64 --rw=randwrite \
      --iodepth_batch_submit=64  --iodepth_batch_complete_max=64
    
  4. Para probar el ancho de banda de las operaciones de escritura, realiza operaciones de escritura secuenciales con múltiples transmisiones paralelas (más de 16) con un tamaño de E/S de 1 MB y una profundidad de E/S mayor o igual que 64.

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    sudo fio --name=write_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=1M --iodepth=64  --iodepth_batch_submit=64  --iodepth_batch_complete_max=64 \
      --rw=write --numjobs=16 --offset_increment=100G
    
  5. Prueba las IOPS de escritura. Para alcanzar las IOPS de PD máximas, debes mantener una cola de E/S profunda. Por ejemplo, si la latencia de operación de escritura es de 1 milisegundo, la VM puede alcanzar, como máximo, 1,000 IOPS por cada E/S en tránsito. Para alcanzar 15,000 IOPS de operaciones de escritura, la VM debe mantener, al menos, 15 E/S en tránsito. Si tu disco y la VM pueden alcanzar 30,000 IOPS de operaciones de escritura, la cantidad de E/S en tránsito debe ser de, al menos, 30 E/S. Si el tamaño de E/S supera los 4 KB, puede que la VM alcance el límite de ancho de banda antes de alcanzar el límite de IOPS.

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    sudo fio --name=write_iops_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=256 --rw=randwrite \
      --iodepth_batch_submit=256  --iodepth_batch_complete_max=256
    
  6. Prueba la latencia de operaciones de escritura. Mientras pruebas la latencia de E/S, la VM no debe alcanzar las IOPS ni el ancho de banda máximos. De lo contrario, la latencia observada no reflejará la latencia de E/S real del disco persistente. Por ejemplo, si el límite de IOPS se alcanza a una profundidad de E/S de 30 y el comando fio duplica ese valor, el total de IOPS se mantendrá igual y la latencia de E/S informada se duplicará.

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    sudo fio --name=write_latency_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=4 --rw=randwrite --iodepth_batch_submit=4  \
      --iodepth_batch_complete_max=4
    
  7. Para probar el ancho de banda de operaciones de lectura, realiza operaciones de lectura secuenciales con múltiples transmisiones paralelas (más de 16) con un tamaño de E/S de 1 MB y una profundidad de E/S mayor o igual que 64.

    sudo fio --name=read_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=1M --iodepth=64 --rw=read --numjobs=16 --offset_increment=100G \
      --iodepth_batch_submit=64  --iodepth_batch_complete_max=64
    
  8. Prueba las IOPS de lectura. Para alcanzar el máximo de IOPS de PD, debes mantener una cola de E/S profunda. Por ejemplo, si el tamaño de E/S supera los 4 KB, puede que la VM alcance el límite de ancho de banda antes de alcanzar el límite de IOPS. A fin de alcanzar el máximo de 100,000 IOPS de operaciones de lectura, especifica --iodepth=256 para esta prueba.

    sudo fio --name=read_iops_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=256 --rw=randread \
      --iodepth_batch_submit=256  --iodepth_batch_complete_max=256
    
  9. Prueba la latencia de operaciones de lectura. Es importante llenar el disco con datos para obtener una medición de latencia realista. Es importante también que la VM no alcance los límites de IOPS o de capacidad de procesamiento durante esta prueba, ya que, después de que el disco persistente alcanza su límite de saturación, este rechaza la E/S entrante y esto se refleja en un aumento artificial en la latencia de E/S.

    sudo fio --name=read_latency_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=4 --rw=randread \
      --iodepth_batch_submit=4  --iodepth_batch_complete_max=4
    
  10. Prueba el ancho de banda de operaciones de lectura secuenciales.

    sudo fio --name=read_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --numjobs=4 --thread --offset_increment=500G \
      --bs=1M --iodepth=64 --rw=read \
      --iodepth_batch_submit=64  --iodepth_batch_complete_max=64
    
  11. Prueba el ancho de banda de operaciones de escritura secuenciales.

    sudo fio --name=write_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --numjobs=4 --thread --offset_increment=500G \
      --bs=1M --iodepth=64 --rw=write \
      --iodepth_batch_submit=64  --iodepth_batch_complete_max=64
    

¿Qué sigue?