Hacer comparativas del rendimiento de Persistent Disk en una VM Linux


En este documento se describe cómo medir el rendimiento de los discos persistentes en máquinas virtuales (VMs) Linux. En el caso de las máquinas virtuales Windows, consulta el artículo Hacer comparativas del rendimiento del disco persistente en una máquina virtual Windows.

Para comparar el rendimiento de los discos persistentes en Linux, usa Flexible I/O tester (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 posible que no pruebe el rendimiento del disco con precisión. En general, evite usar dispositivos especiales como /dev/urandom, /dev/random y /dev/zero en sus comparativas de rendimiento de Persistent Disk.

Para medir las IOPS y el rendimiento de un disco en uso en una instancia en ejecución, ejecuta una prueba comparativa del sistema de archivos con la configuración prevista. Usa esta opción para probar una carga de trabajo realista sin perder el contenido de tu disco. Ten en cuenta que, al comparar el rendimiento del sistema de archivos en un disco, hay muchos factores específicos de tu entorno de desarrollo que pueden afectar a los resultados de la prueba comparativa, por lo que es posible que no alcances los límites de rendimiento del disco.

Para medir el rendimiento sin procesar de un disco persistente, haz una prueba de rendimiento del dispositivo de bloque 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 sistemas operativos Debian o Ubuntu con el gestor de paquetes apt.

Hacer comparativas de las IOPS y el rendimiento de un disco en una instancia en ejecución

Si quieres medir las IOPS y el rendimiento de una carga de trabajo realista en un disco activo de una instancia en ejecución sin perder el contenido del disco, haz una prueba comparativa con un directorio nuevo del sistema de archivos. Cada prueba fio se ejecuta durante cinco minutos.

  1. Conéctate a tu instancia.

  2. Instala las dependencias:

    sudo apt update
    sudo apt install -y fio
    
  3. En el terminal, enumera los discos conectados a tu VM y busca el disco que quieras probar. Si tu disco persistente aún no está formateado, formatea y monta el disco.

    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 2500 GB con el ID de dispositivo sdb.

  4. Crea un directorio llamado fiotest en el disco. En este ejemplo, el disco está montado en /mnt/disks/mnt_dir:

    TEST_DIR=/mnt/disks/mnt_dir/fiotest
    sudo mkdir -p $TEST_DIR
    
  5. Prueba el rendimiento de escritura realizando escrituras secuenciales con varias secuencias paralelas (16 o más), usando 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 realizando escrituras 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 el rendimiento de lectura realizando lecturas secuenciales con varios flujos paralelos (16 o más), 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 realizando 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*
    

Hacer comparativas del rendimiento de discos persistentes sin formato

Si quieres medir el rendimiento de los discos persistentes por separado fuera de tu entorno de desarrollo, prueba el rendimiento de lectura y escritura de un dispositivo de bloque en un disco persistente y una VM desechables. Cada prueba fio dura cinco minutos. En los siguientes comandos se presupone que hay un disco persistente SSD de 2500 GB conectado a tu VM. Si el tamaño de tu dispositivo es diferente, modifica el valor del --filesize argumento. Este tamaño de disco es necesario para alcanzar los límites de rendimiento de las VMs de 32 vCPUs. Para obtener más información, consulta Rendimiento del almacenamiento en bloque.

  1. Crea y pon en marcha una instancia de VM.

  2. Añade un disco persistente a la instancia de VM que quieras usar como referencia.

  3. Conéctate a tu instancia.

  4. Instala las dependencias:

    sudo apt-get update
    sudo apt-get install -y fio
    
  5. Rellena el disco con datos distintos de cero. Las lecturas de discos persistentes de bloques vacíos tienen un perfil de latencia diferente al de los bloques que contienen datos. Te recomendamos que llenes el disco antes de ejecutar cualquier prueba de latencia 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
    
  6. Prueba el ancho de banda de escritura realizando escrituras secuenciales con varias secuencias paralelas (16 o más), usando 1 MB como tamaño de E/S y con una profundidad de E/S igual o superior a 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
    
  7. IOPS de escritura de prueba. Para conseguir el máximo de IOPS de PD, debes mantener una cola de E/S profunda. Por ejemplo, si la latencia de escritura es de 1 milisegundo, la VM puede alcanzar, como máximo, 1000 IOPS por cada E/S en curso. Para alcanzar las 15.000 IOPS de escritura, la VM debe mantener al menos 15 operaciones de E/S en curso. Si tu disco y tu VM pueden alcanzar las 30.000 IOPS de escritura, el número de operaciones de E/S en curso debe ser de al menos 30. Si el tamaño de E/S es superior a 4 KB, es posible 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
    
  8. Latencia de escritura de prueba. Durante las pruebas de latencia de E/S, la VM no debe alcanzar el ancho de banda ni las IOPS máximos. De lo contrario, la latencia observada no reflejará la latencia de E/S real del disco persistente. Por ejemplo, si se alcanza el límite de IOPS con una profundidad de E/S de 30 y el comando fio tiene el doble, el total de IOPS sigue siendo el mismo y la latencia de E/S registrada se duplica.

    # 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
    
  9. Prueba el ancho de banda de lectura realizando lecturas secuenciales con varios flujos paralelos (16 o más), usando 1 MB como tamaño de E/S y con una profundidad de E/S igual o superior a 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
    
  10. IOPS de lectura de prueba. 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 es superior a 4 KB, la máquina virtual puede alcanzar el límite de ancho de banda antes de alcanzar el límite de IOPS. Para alcanzar el máximo de 100.000 IOPS de lectura, especifica --iodepth=256 en 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
    
  11. Prueba la latencia de lectura. Es importante llenar el disco con datos para obtener una medición de latencia realista. Es importante que la VM no alcance los límites de IOPS o de procesamiento durante esta prueba, ya que, cuando el disco persistente alcance su límite de saturación, rechazará las operaciones de E/S entrantes, lo que se reflejará como un aumento artificial de 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
    
  12. Prueba el ancho de banda de lectura secuencial.

    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
    
  13. Prueba el ancho de banda de escritura secuencial.

    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
    
  14. Limpia el disco persistente y la VM desechables:

    1. Elimina el disco que se ha usado para comparar el rendimiento.
    2. Elimina la VM que has creado para comparar el rendimiento.

Siguientes pasos