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). No uses otras herramientas de comparativas de discos, como dd, que de forma predeterminada usa una profundidad de cola de E/S muy baja, por lo que es difícil garantizar que la comparativa esté generando una cantidad suficiente de operaciones de E/S (IOPS) y bytes para probar con exactitud el rendimiento del disco.

Los dispositivos especiales que se usan con dd suelen ser muy lentos y no reflejan con exactitud el rendimiento del disco persistente. En general, evita usar dispositivos especiales, como /dev/urandom y /dev/random. Aunque estos archivos generan datos aleatorios que son más representativos de las cargas de trabajo del mundo real, pueden ser costosos en términos de procesamiento y pueden producir un cuello de botella en la comparativa, lo que genera resultados imprecisos. Además, cuando se usa /dev/zero como entrada para dd, el archivo proporciona una transmisión ilimitada de ceros, pero se puede comprimir en gran medida y puede no representar cargas de trabajo reales.

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 comparativos, 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. Instala 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 almacenamiento en 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 cualquier comparativa de latencia de operaciones de lectura.

    Cuando ejecutas este comando, se pierden datos en el segundo dispositivo. # Recomendamos especialmente

    usar una VM y un disco desechables. 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.

    Cuando ejecutas este comando, se pierden datos en el segundo dispositivo. # Recomendamos especialmente

    usar una VM y un disco desechables. 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 máximas de disco persistente, 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.

    Cuando ejecutas este comando, se pierden datos en el segundo dispositivo. # Recomendamos especialmente

    usar una VM y un disco desechables. 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á.

    Cuando ejecutas este comando, se pierden datos en el segundo dispositivo. # Recomendamos especialmente

    usar una VM y un disco desechables. 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 operaciones de lectura. Para alcanzar las IOPS máximas de disco persistente, 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. Para 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?