Comparar el rendimiento de Hyperdisk


Para comparar el Rendimiento de los hiperparámetros, usa el Verificador de E/S flexible (FIO) en lugar de otras herramientas de comparativas de discos, comodd. 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 bytes y operaciones de E/S 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. En general, evita usar dispositivos especiales como /dev/urandom, /dev/random y /dev/zero en tus comparativas de rendimiento de Hyperdisk.

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 Hyperdisk, 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 de VM en ejecución sin perder el contenido del disco, realiza la comparación con un directorio nuevo en el sistema de archivos existente.

Prepara la prueba

  1. Conéctate a tu instancia

  2. Instala las dependencias:

    sudo apt update
    sudo apt install -y fio
    
  3. Si tu Hyperdisk aún no tiene formato, dale formato y actívalo.

  4. En la terminal, enumera los discos adjuntos a tu VM y busca el disco que deseas probar.

    sudo lsblk
    

    El comando anterior produce un resultado similar al siguiente:

    NAME         MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
    nvme0n1      259:0    0    10G  0 disk
    ├─nvme0n1p1  259:1    0   9.9G  0 part  /
    ├─nvme0n1p14 259:2    0     4M  0 part
    └─nvme0n1p15 259:3    0   106M  0 part  /boot/efi
    nvme0n2      259:4    0   3.4T  0 disk
    

    En este ejemplo, estamos probando un volumen de Hyperdisk Extreme de 3,500 GiB con el nombre de dispositivo nvme0n2.

  5. 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
    
  6. Si la VM usa la interfaz de disco NVMe para el adjunto de Hyperdisk (si el nombre del disco sin procesar tiene el prefijo nvme), realiza los siguientes pasos a fin de obtener la cantidad de nodos de NUMA disponibles para la VM.

    La estrategia de comparativas para discos NVMe difiere para las VMs con solo un nodo de NUMA y las VMs con más de un nodo de NUMA. Cuando se prueba el rendimiento de Hyperdisk con la interfaz de disco NVMe, solo se asignan 256 tamaños de cola de NVMe por cola. Debido a los tamaños limitados de las colas de NVMe disponibles y a la posible contención proveniente de los otros discos conectados a la misma VM, estas pruebas de comparativas usan dos colas de discos NVMe para mantener un tamaño de cola agregado capaz de controlar ioDepth de 256.

    1. Obtén la cantidad de nodos de NUMA.

      lscpu | grep -i 'numa node(s)' | awk '{print $NF}'
      
    2. Si la VM solo tiene 1 nodo de NUMA, obtén la asignación de colas de CPU a NVMe. Usarás esta información más adelante para el parámetro --cpus-allowed.

      QUEUE_1_CPUS=$(cat /sys/class/block/nvme0n2/mq/*/cpu_list | sed -n 1p | tr -d " \t")
      QUEUE_2_CPUS=$(cat /sys/class/block/nvme0n2/mq/*/cpu_list | sed -n 2p | tr -d " \t")
      

Prueba la capacidad de procesamiento de escritura

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.

  1. Si el Hyperdisk usa la interfaz SCSI:

    sudo fio --directory=$TEST_DIR \
    --numjobs=16 --size=10G --time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
    --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
    --name=write_throughput
    
  2. Si el Hyperdisk usa la interfaz NVMe:

    1. Si la VM tiene solo un nodo de NUMA, usa el siguiente comando:

      sudo fio --directory=$TEST_DIR --numjobs=8 \
      --size=10G --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --cpus_allowed_policy=split \
      --group_reporting \
      --name=write_throughput --cpus_allowed=$QUEUE_1_CPUS \
      --name=write_throughput_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. Si la VM tiene más de un nodo de NUMA, usa el siguiente comando:

      sudo fio --directory=$TEST_DIR --numjobs=8 \
      --size=10G --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --group_reporting \
      --name=write_throughput --numa_cpu_nodes=0 \
      --name=write_throughput_2 --numa_cpu_nodes=1
      

Prueba las IOPS de escritura

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.

  1. Si el Hyperdisk se conecta usando la interfaz SCSI, sigue estos pasos:

    sudo fio --directory=$TEST_DIR \
    --numjobs=16 --size=10G -time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randwrite \
    --iodepth_batch_submit=256  --iodepth_batch_complete_max=256 \
    --name=write_iops
    
  2. Si el Hyperdisk usa la interfaz NVMe:

    1. Si la VM tiene solo un nodo de NUMA, usa el siguiente comando:

      sudo fio --directory=$TEST_DIR --numjobs=8 \
      --size=10G --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randwrite \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --cpus_allowed_policy=split \
      --group_reporting \
      --name=write_iops --cpus_allowed=$QUEUE_1_CPUS \
      --name=write_iops_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. Si la VM tiene más de un nodo de NUMA, usa el siguiente comando:

      sudo fio --directory=$TEST_DIR --numjobs=8 --size=10G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randwrite \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --group_reporting \
      --name=write_iops --numa_cpu_nodes=0 \
      --name=write_iops_2 --numa_cpu_nodes=1
      

Prueba la capacidad de procesamiento de lectura

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.

  1. Si el Hyperdisk usa la interfaz SCSI:

    sudo fio --directory=$TEST_DIR \
    --numjobs=16 --size=10G --time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
    --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
    --name=read_throughput
    
  2. Si el Hyperdisk usa la interfaz NVMe:

    1. Si la VM tiene solo un nodo de NUMA, usa el siguiente comando:

      sudo fio --directory=$TEST_DIR --numjobs=8 --size=10G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --cpus_allowed_policy=split \
      --group_reporting \
      --name=read_throughput --cpus_allowed=$QUEUE_1_CPUS \
      --name=read_throughput_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. Si la VM tiene más de un nodo de NUMA, usa el siguiente comando:

      sudo fio --directory=$TEST_DIR --numjobs=8 --size=10G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --group_reporting \
      --name=read_throughput --numa_cpu_nodes=0 \
      --name=read_throughput_2 --numa_cpu_nodes=1
      

Prueba las IOPS de operaciones de lectura

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.

  1. Si el Hyperdisk usa la interfaz SCSI:

    sudo fio --directory=$TEST_DIR \
    --numjobs=16 --size=10G --time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randread \
    --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
    --name=read_iops
    
  2. Si el Hyperdisk usa la interfaz NVMe:

    1. Si la VM tiene solo un nodo de NUMA, usa el siguiente comando:

      sudo fio --directory=$TEST_DIR --numjobs=8 --size=10G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randread \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --cpus_allowed_policy=split \
      --group_reporting \
      --name=read_iops --cpus_allowed=$QUEUE_1_CPUS \
      --name=read_iops_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. Si la VM tiene más de un nodo de NUMA, usa el siguiente comando:

      sudo fio --directory=$TEST_DIR --numjobs=8 --size=10G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randread \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --group_reporting \
      --name=read_iops --numa_cpu_nodes=0 \
      --name=read_iops_2 --numa_cpu_nodes=1
      

Limpia

Quita los directorios de prueba.

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

Comparativas de IOPS y capacidad de procesamiento para Hyperdisk Extreme en VMs C3

Google Cloud Hyperdisk Extreme ofrece un mayor rendimiento en las VMs C3 con 176 CPU virtuales. Para alcanzar los límites de rendimiento más altos, debes adjuntar varios volúmenes de Hyperdisk Extreme a la VM.

Para medir la E/S por segundo (IOPS) o la capacidad de procesamiento de una carga de trabajo realista en discos activos en una VM C3 en ejecución sin perder el contenido de los discos de datos existentes, compara los datos con un directorio nuevo en el sistema de archivos existente y conecta nuevos volúmenes de Hyperdisk Extreme a la VM para las tareas de comparativas.

En los discos conectados con la interfaz de NVMe, se recomienda distribuir la carga de trabajo de E/S en todas las colas de NVMe disponibles para la VM. Esto maximiza el rendimiento de Hyperdisk. En las VMs C3 con 176 CPU virtuales, hay cuatro nodos de NUMA asignados de 1 a 1 a cuatro colas de NVMe. Esta asignación se supone para las pruebas comparativas en esta sección.

Prepara la prueba

  1. Agrega discos nuevos de Hyperdisk Extreme a tu VM y consulta los límites de rendimiento de Hyperdisk para derivar la configuración de disco necesaria para tu rendimiento objetivo.

  2. Conéctate a la instancia:

  3. Instala las dependencias:

    sudo apt update
    sudo apt install -y fio
    
  4. Enumera los discos conectados a tu VM y busca el disco que deseas probar.

    sudo lsblk
    

    El comando anterior produce un resultado similar al siguiente:

    NAME         MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
    nvme0n1      259:0    0    10G  0 disk
    ├─nvme0n1p1  259:1    0   9.9G  0 part  /
    ├─nvme0n1p14 259:2    0     4M  0 part
    └─nvme0n1p15 259:3    0   106M  0 part  /boot/efi
    nvme0n2      259:4    0   2.5T  0 disk
    nvme0n3      259:5    0   2.5T  0 disk
    nvme0n4      259:6    0   2.5T  0 disk
    

    En este ejemplo, estamos probando el rendimiento de Google Cloud Hyperdisk en tres volúmenes de 2,500 GiB de Hyperdisk Extreme en dispositivos llamados nvme0n2, nvme0n3 y nvme0n4.

Compara la capacidad de procesamiento de Hyperdisk Extreme en C3

En esta sección, se muestra cómo comparar la capacidad de procesamiento de lectura y escritura de los discos Hyperdisk Extreme.

Prepárate para la prueba

Antes de comenzar a comparar el rendimiento de los discos de Hyperdisk Extreme con una VM C3 con 176 CPU virtuales, completa los siguientes pasos.

  1. Crea un directorio nuevo, fiotest, en tu sistema operativo. En este ejemplo, el directorio raíz es /mnt/disks/mnt_dir:

    TEST_DIR=/mnt/disks/mnt_dir/fiotest
    sudo mkdir -p $TEST_DIR
    
  2. Debido a que la VM requiere más de un disco para alcanzar los niveles de rendimiento más altos, para simplificar, realiza RAID 0 en todos los volúmenes de Hyperdisk conectados. Esto facilita la distribución uniforme de los datos en varios volúmenes de Hyperdisk.

    En este ejemplo, RAID 0 es el rendimiento en tres volúmenes de Hyperdisk Extreme conectados a la VM C3.

    sudo mdadm --create /dev/md0 --level=0 --raid-devices=3 /dev/nvme0n2 /dev/nvme0n3 /dev/nvme0n4
    
  3. Da formato y activa el volumen RAID /dev/md0.

Prueba la capacidad de procesamiento de escritura

Prueba la capacidad de procesamiento de escritura realizando operaciones de escritura secuenciales con varias transmisiones paralelas (al menos 16), usando un tamaño de bloque de E/S de 1 MiB y una profundidad total de E/S de al menos 32 por cola de NVMe.

# Running this command causes data loss on the targeted file on the device.
# We strongly recommend using a throwaway disk.

sudo fio --name=global --group_reporting=1 --filesize=1024G \
--filename=$TEST_DIR/fiotestfile --numjobs=4 --size=64G \
--offset_increment=64G --time_based --runtime=5m \
--ramp_time=10s --ioengine=libaio --direct=1 --verify=0 \
--bs=1M --iodepth=8 --rw=write \
--name=write_throughput --numa_cpu_nodes=0 \
--name=write_throughput_1 --numa_cpu_nodes=1 \
--name=write_throughput_2 --numa_cpu_nodes=2 \
--name=write_throughput_3 --numa_cpu_nodes=3

Prueba la capacidad de procesamiento de lectura

Prueba la capacidad de procesamiento de lectura realizando operaciones lecturas secuenciales con varias transmisiones paralelas (al menos 16), con un tamaño de bloque de E/S de 1 MiB y una profundidad total de E/S de al menos 32 por cola de NVMe.

sudo fio --name=global --group_reporting=1 --filesize=1024G \
--filename=$TEST_DIR/fiotestfile --numjobs=4 --size=64G \
--offset_increment=64G --time_based --runtime=5m \
--ramp_time=10s --ioengine=libaio --direct=1 \
--verify=0 --bs=1M --iodepth=8 --rw=read \
--name=read_throughput --numa_cpu_nodes=0 \
--name=read_throughput_1 --numa_cpu_nodes=1 \
--name=read_throughput_2 --numa_cpu_nodes=2 \
--name=read_throughput_3 --numa_cpu_nodes=3

Compara las IOPS de Hyperdisk Extreme en C3

Para comparar el rendimiento de E/S por segundo (IOPS), recomendamos realizar operaciones de E/S pequeñas y paralelas directamente desde o hacia discos sin procesar (sin RAID).

Prueba las IOPS de escritura

Prueba las IOPS de escritura realizando operaciones de escritura aleatorias, con un tamaño de bloque de E/S de 4 KiB y una profundidad de E/S de al menos 256, con al menos 2 colas de NVMe.

# Running this command causes data loss on the targeted device.
# We strongly recommend using a throwaway disk.

sudo fio --name=global --group_reporting=1 \
--directory=/ --bs=4K --direct=1 \
--filesize=512G --iodepth=256 \
--iodepth_batch_complete_max=256 --iodepth_batch_submit=256 \
--ioengine=libaio --numjobs=5 --ramp_time=10s \
--randrepeat=0 --runtime=5m --rw=randwrite \
--time_based=1 --verify=0 \
--name=write_iops_test --filename=/dev/nvme0n2 --numa_cpu_nodes=0 \
--name=write_iops_test_1 --filename=/dev/nvme0n3  --numa_cpu_nodes=1 \
--name=write_iops_test_2 --filename=/dev/nvme0n4 --numa_cpu_nodes=2

Prueba las IOPS de operaciones de lectura

Prueba las IOPS de lectura realizando operaciones de lecturas aleatorias, con un tamaño de bloque de E/S de 4 KiB y una profundidad de E/S de al menos 256, con al menos 2 colas de NVMe.

sudo fio --name=global --group_reporting=1 --directory=/ \
--bs=4K --direct=1 --filesize=512G --iodepth=256 \
--iodepth_batch_complete_max=256 --iodepth_batch_submit=256 \
--ioengine=libaio --numjobs=5 --ramp_time=10s \
--randrepeat=0 --runtime=5m --rw=randread \
--time_based=1 --verify=0 \
--name=read_iops_test --filename=/dev/nvme0n2 --numa_cpu_nodes=0 \
--name=read_iops_test_1 --filename=/dev/nvme0n3  --numa_cpu_nodes=1 \
--name=read_iops_test_2 --filename=/dev/nvme0n4 --numa_cpu_nodes=2

Compara la latencia de Hyperdisk Extreme en C3

Mientras pruebas la latencia de E/S, la VM no debe alcanzar las IOPS ni el ancho de banda máximos. Si lo hace, la latencia observada no reflejará la latencia de E/S real de Hyperdisk. Por ejemplo, si la VM alcanza el límite de IOPS a una profundidad de E/S de 30 y el comando fio lo duplicó, el total de IOPS se mantendrá igual y la latencia de E/S informada se duplicará.

Es suficiente apuntar a un solo dispositivo de disco sin procesar directamente para obtener latencias de E/S realistas.

Prueba la latencia de operaciones de escritura

Prueba la latencia de escritura realizando operaciones de escritura aleatorias, con un tamaño de bloque de E/S de 4 KiB y una profundidad de E/S de 4.

# Running this command causes data loss on the targeted device.
# We strongly recommend using a throwaway disk.

sudo fio --filename=/dev/nvme0n2  \
--filesize=512G --time_based \
--runtime=5m --ramp_time=10s --ioengine=libaio \
--direct=1 --verify=0 --bs=4K --iodepth=4 --rw=randwrite \
--iodepth_batch_submit=4 --iodepth_batch_complete_max=4 \
--name=write_latency

Prueba la latencia de operaciones de lectura

Prueba la latencia de lectura realizando operaciones de lecturas aleatorias, con un tamaño de bloque de E/S de 4 KiB y una profundidad de E/S de 4.

sudo fio --filename=/dev/nvme0n2  \
--filesize=512G --time_based \
--runtime=5m --ramp_time=10s --ioengine=libaio \
--direct=1 --verify=0 --bs=4K --iodepth=4 --rw=randread \
--iodepth_batch_submit=4 --iodepth_batch_complete_max=4 \
--name=read_latency

Limpia

  1. Quita los archivos de prueba.

    sudo rm -rf $TEST_DIR/*
    
  2. Desactiva y detén el volumen de RAID.

    sudo umount /dev/md0
    sudo mdadm --stop /dev/md0
    
  3. Desconecta y borra los volúmenes de Hyperdisk conectados. Consulta los comandos gcloud compute instances detach-disk y gcloud compute disks delete.

Compara el rendimiento del Hyperdisk sin procesar

Si deseas medir solo el rendimiento de los volúmenes de Hyperdisk, fuera de tu entorno de desarrollo, puedes probar el rendimiento de lectura y escritura para un dispositivo de bloques en un disco y una VM desechables.

Los siguientes comandos suponen que hay un volumen Hyperdisk Extreme de 3,500 GiB conectado a la VM. Este tamaño de disco es necesario para alcanzar los límites de capacidad de procesamiento de VM de 32 CPUs virtuales. Si el tamaño de tu dispositivo es diferente, modifica el valor del argumento --filesize en los siguientes comandos. Para obtener más información sobre los límites de rendimiento de los tipos de máquinas de VM, consulta Compatibilidad con tipos de máquinas.

Prepara la prueba

  1. Conéctate a tu instancia

  2. Instala las dependencias:

    sudo apt-get update
    sudo apt-get install -y fio
    
  3. Obtén la ruta de acceso al disco sin procesar. Almacena la ruta de acceso en una variable. En el siguiente ejemplo, se usa /dev/nvme0n2 como la ruta de acceso del disco sin procesar:

    TEST_DIR=/dev/nvme0n2
    
  4. Llena el disco con datos distintos de cero. Las lecturas de Hyperdisk 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=$TEST_DIR --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
    
  5. Si la VM usa la interfaz de disco NVMe para el adjunto de Hyperdisk (si el nombre del disco sin procesar tiene el prefijo nvme), realiza los siguientes pasos a fin de obtener la cantidad de nodos de NUMA disponibles para la VM.

    La estrategia de comparativas para discos NVMe difiere para las VMs con solo un nodo de NUMA y las VMs con más de un nodo de NUMA. Cuando se prueba el rendimiento de Hyperdisk con la interfaz de disco NVMe, solo se asignan 256 tamaños de cola de NVMe por cola. Debido a los tamaños limitados de las colas de NVMe disponibles y a la posible contención proveniente de los otros discos conectados a la misma VM, estas pruebas de comparativas usan dos colas de discos NVMe para mantener un tamaño de cola agregado capaz de controlar ioDepth de 256.

    1. Obtén la cantidad de nodos de NUMA.

      lscpu | grep -i 'numa node(s)' | awk '{print $NF}'
      
    2. Si la VM solo tiene 1 nodo de NUMA, obtén la asignación de colas de CPU a NVMe. Usarás esta información más adelante para el parámetro --cpus-allowed.

      QUEUE_1_CPUS=$(cat /sys/class/block/nvme0n2/mq/*/cpu_list | sed -n 1p | tr -d " \t")
      QUEUE_2_CPUS=$(cat /sys/class/block/nvme0n2/mq/*/cpu_list | sed -n 2p | tr -d " \t")
      

Prueba la capacidad de procesamiento de escritura

Prueba la capacidad de procesamiento de escritura mediante la realización de operaciones de escritura secuenciales con varias 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.

  1. Si Hyperdisk se conecta usando la interfaz SCSI, sigue estos pasos:

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    
    sudo fio --filename=$TEST_DIR \
    --numjobs=16 --size=500G --time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
    --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
    --offset_increment=20G \
    --name=write_throughput
    
  2. Si el Hyperdisk usa la interfaz NVMe:

    1. Si la VM tiene solo un nodo de NUMA, usa el siguiente comando:

      # Running this command causes data loss on the second device.
      # We strongly recommend using a throwaway VM and disk.
      
      sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --cpus_allowed_policy=split \
      --offset_increment=20G --group_reporting \
      --name=write_throughput --cpus_allowed=$QUEUE_1_CPUS \
      --name=write_throughput_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. Si la VM tiene más de un nodo de NUMA, usa el siguiente comando:

      # Running this command causes data loss on the second device.
      # We strongly recommend using a throwaway VM and disk.
      
      sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --offset_increment=20G --group_reporting \
      --name=write_throughput --numa_cpu_nodes=0 \
      --name=write_throughput_2 --numa_cpu_nodes=1
      

Prueba las IOPS de escritura

Para alcanzar las IOPS de Hyperdisk 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 operaciones de E/S en tránsito. Si tu disco y la VM pueden alcanzar 30,000 IOPS de operaciones de escritura, la cantidad de operaciones de E/S en tránsito debe ser de 30 como mínimo. 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.

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.

  1. Si el volumen de Hyperdisk Extreme se conecta usando la interfaz SCSI, sigue estos pasos:

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    
    sudo fio --filename=$TEST_DIR \
    --numjobs=16 --size=500G -time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randwrite \
    --iodepth_batch_submit=256  --iodepth_batch_complete_max=256 \
    --name=write_iops
    
  2. Si el volumen de Hyperdisk Extreme se conecta con la interfaz NVMe, haz lo siguiente:

    1. Si la VM tiene solo un nodo de NUMA, usa el siguiente comando:

      # Running this command causes data loss on the second device.
      # We strongly recommend using a throwaway VM and disk.
      
      sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randwrite \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --cpus_allowed_policy=split \
      --group_reporting \
      --name=write_write_iops --cpus_allowed=$QUEUE_1_CPUS \
      --name=write_write_iops_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. Si la VM tiene más de un nodo de NUMA, usa el siguiente comando:

      # Running this command causes data loss on the second device.
      # We strongly recommend using a throwaway VM and disk.
      
      sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randwrite \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --group_reporting \
      --name=write_iops --numa_cpu_nodes=0 \
      --name=write_iops_2 --numa_cpu_nodes=1
      

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 de Hyperdisk. 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 --filename=$TEST_DIR \
--filesize=500G --time_based \
--runtime=5m --ramp_time=10s --ioengine=libaio \
--direct=1 --verify=0 --bs=4K --iodepth=4 --rw=randwrite \
--iodepth_batch_submit=4 --iodepth_batch_complete_max=4 \
--name=write_latency

Prueba el ancho de banda de operaciones de lectura

Prueba la capacidad de ancho de banda 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.

  1. Si el volumen de Hyperdisk Extreme se conecta usando la interfaz SCSI, haz lo siguiente:

     sudo fio --filename=$TEST_DIR \
     --numjobs=16 --size=500G --time_based \
     --runtime=5m --ramp_time=10s --ioengine=libaio \
     --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
     --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
     --offset_increment=20G --name=read_bandwidth
  2. Si el volumen de Hyperdisk Extreme se conecta con la interfaz NVMe, haz lo siguiente:

    1. Si la VM tiene solo un nodo de NUMA, usa el siguiente comando:

        sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
        --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
        --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
        --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
        --cpus_allowed_policy=split \
        --offset_increment=20G --group_reporting \
        --name=read_bandwidth --cpus_allowed=$QUEUE_1_CPUS \
        --name=read_bandwidth_2 --cpus_allowed=$QUEUE_2_CPUS
    2. Si la VM tiene más de un nodo de NUMA, usa el siguiente comando:

        sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
        --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
        --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
        --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
        --offset_increment=20G --group_reporting \
        --name=read_bandwidth --numa_cpu_nodes=0 \
        --name=read_bandwidth_2 --numa_cpu_nodes=1

Prueba las IOPS de operaciones de lectura

Para alcanzar el máximo de IOPS de Hyperdisk, 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 las IOPS de lectura máximas disponibles para un tipo de máquina, especifica --iodepth=256 en esta prueba.

  1. Si el volumen de Hyperdisk Extreme se conecta usando la interfaz SCSI, haz lo siguiente:

    sudo fio --filename=$TEST_DIR \
    --numjobs=16 --size=500G --time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randread \
    --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
    --name=read_iops
    
  2. Si el volumen de Hyperdisk Extreme se conecta con la interfaz NVMe, haz lo siguiente:

    1. Si la VM tiene solo un nodo de NUMA, usa el siguiente comando:

      sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randread \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --cpus_allowed_policy=split \
      --group_reporting \
      --name=read_iops --cpus_allowed=$QUEUE_1_CPUS \
      --name=read_iops_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. Si la VM tiene más de un nodo de NUMA, usa el siguiente comando:

      sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randread \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --group_reporting \
      --name=read_iops --numa_cpu_nodes=0 \
      --name=read_iops_2 --numa_cpu_nodes=1
      

Prueba la latencia de operaciones de lectura

Es importante llenar el disco con datos para obtener una medición de latencia realista. También es importante que la VM no alcance los límites de IOPS o capacidad de procesamiento durante esta prueba, ya que, después de que el volumen de Hyperdisk alcanza su límite de saturación, este rechaza las operaciones de E/S entrantes. Este rechazo se refleja como un aumento artificial en la latencia de E/S.

 sudo fio --filename=$TEST_DIR \
 --filesize=500G --time_based \
 --runtime=5m --ramp_time=10s --ioengine=libaio \
 --direct=1 --verify=0 --bs=4K --iodepth=4 --rw=randread \
 --iodepth_batch_submit=4 --iodepth_batch_complete_max=4 \
 --name=read_latency

Limpia

Si usaste un disco y una VM desechables como se recomienda, después de completar las pruebas comparativas, puedes hacer lo siguiente:

  • Desconectar y borrar el disco.
  • Borra la VM.

¿Qué sigue?