Hacer comparativas del rendimiento de las SSD locales


Los límites de rendimiento de las SSD locales que se indican en la sección Elegir una opción de almacenamiento se han conseguido usando ajustes específicos en la instancia de SSD local. Si tu instancia de máquina virtual (VM) tiene problemas para alcanzar estos límites de rendimiento y ya la has configurado con los ajustes de SSD local recomendados, puedes comparar tus límites de rendimiento con los publicados. Para ello, replica los ajustes que utiliza el equipo de Compute Engine.

En estas instrucciones se presupone que usas un sistema operativo Linux con el gestor de paquetes apt instalado.

Crear una VM con una unidad SSD local

El número de SSD locales que puede tener una VM se basa en el tipo de máquina que uses para crear la VM. Para obtener más información, consulta Elegir un número válido de SSDs locales.

  1. Crea una instancia de SSD local que tenga cuatro u ocho vCPUs por dispositivo, en función de tu carga de trabajo.

    Por ejemplo, el siguiente comando crea una VM C3 con 4 vCPUs y 1 SSD local.

    gcloud compute instances create c3-ssd-test-instance \
        --machine-type "c3-standard-4-lssd"
    

    En los tipos de máquinas de segunda generación y anteriores, se especifica el número de SSD local que se va a asociar a la VM mediante la marca --local-ssd. El siguiente comando crea una VM N2 con 8 vCPUs y 1 SSD local que usa la interfaz de disco NVMe:

    gcloud compute instances create ssd-test-instance \
        --machine-type "n2-standard-8" \
        --local-ssd interface=nvme
    
  2. Ejecuta la siguiente secuencia de comandos en tu máquina virtual. La secuencia de comandos replica los ajustes utilizados para obtener las cifras de rendimiento de SSD que se indican en la sección de rendimiento. Ten en cuenta que el parámetro --bs define el tamaño del bloque, lo que afecta a los resultados de los distintos tipos de operaciones de lectura y escritura.

    # install tools
    sudo apt-get -y update
    sudo apt-get install -y fio util-linux
    
    # discard Local SSD sectors
    sudo blkdiscard /dev/disk/by-id/google-local-nvme-ssd-0
    
    # full write pass - measures write bandwidth with 1M blocksize
    sudo fio --name=writefile \
    --filename=/dev/disk/by-id/google-local-nvme-ssd-0 --bs=1M --nrfiles=1 \
    --direct=1 --sync=0 --randrepeat=0 --rw=write --end_fsync=1 \
    --iodepth=128 --ioengine=libaio
    
    # rand read - measures max read IOPS with 4k blocks
    sudo fio --time_based --name=readbenchmark --runtime=30 --ioengine=libaio \
    --filename=/dev/disk/by-id/google-local-nvme-ssd-0  --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=4 --rw=randread --blocksize=4k --group_reporting
    
    # rand write - measures max write IOPS with 4k blocks
    sudo fio --time_based --name=writebenchmark  --runtime=30 --ioengine=libaio \
    --filename=/dev/disk/by-id/google-local-nvme-ssd-0 --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=4 --rw=randwrite --blocksize=4k --group_reporting
    

Crear una VM con el número máximo de SSD locales

  1. Si quieres adjuntar 24 o más dispositivos SSD locales a una instancia, usa un tipo de máquina con 32 vCPUs o más.

    Los siguientes comandos crean una VM con el número máximo permitido de discos SSD locales mediante la interfaz NVMe:

    Asociar un SSD local a una VM

    gcloud compute instances create ssd-test-instance \
        --machine-type "n1-standard-32" \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme
    

    Usar tipos de máquinas -lssd

    Las series de máquinas más recientes ofrecen tipos de máquinas -lssd que incluyen un número predeterminado de discos SSD locales. Por ejemplo, para comparar el rendimiento de una VM con 32 SSD locales (12 TiB de capacidad), usa el siguiente comando:

    gcloud compute instances create ssd-test-instance \
        --machine-type "c3-standard-176-lssd"
    
  2. Instala la herramienta mdadm. El proceso de instalación de mdadm incluye una petición al usuario que detiene las secuencias de comandos, por lo que debes ejecutar el proceso manualmente:

    Debian y Ubuntu

    sudo apt update && sudo apt install mdadm --no-install-recommends
    

    CentOS y RHEL

    sudo yum install mdadm -y
    

    SLES y openSUSE

    sudo zypper install -y mdadm
    
  3. Usa el comando find para identificar todas las unidades SSD locales que quieras montar juntas:

    find /dev/ | grep google-local-nvme-ssd
    

    El resultado es similar al siguiente:

    /dev/disk/by-id/google-local-nvme-ssd-23
    /dev/disk/by-id/google-local-nvme-ssd-22
    /dev/disk/by-id/google-local-nvme-ssd-21
    /dev/disk/by-id/google-local-nvme-ssd-20
    /dev/disk/by-id/google-local-nvme-ssd-19
    /dev/disk/by-id/google-local-nvme-ssd-18
    /dev/disk/by-id/google-local-nvme-ssd-17
    /dev/disk/by-id/google-local-nvme-ssd-16
    /dev/disk/by-id/google-local-nvme-ssd-15
    /dev/disk/by-id/google-local-nvme-ssd-14
    /dev/disk/by-id/google-local-nvme-ssd-13
    /dev/disk/by-id/google-local-nvme-ssd-12
    /dev/disk/by-id/google-local-nvme-ssd-11
    /dev/disk/by-id/google-local-nvme-ssd-10
    /dev/disk/by-id/google-local-nvme-ssd-9
    /dev/disk/by-id/google-local-nvme-ssd-8
    /dev/disk/by-id/google-local-nvme-ssd-7
    /dev/disk/by-id/google-local-nvme-ssd-6
    /dev/disk/by-id/google-local-nvme-ssd-5
    /dev/disk/by-id/google-local-nvme-ssd-4
    /dev/disk/by-id/google-local-nvme-ssd-3
    /dev/disk/by-id/google-local-nvme-ssd-2
    /dev/disk/by-id/google-local-nvme-ssd-1
    /dev/disk/by-id/google-local-nvme-ssd-0
    

    find no garantiza un orden. No importa si los dispositivos se muestran en un orden diferente, siempre que el número de líneas de salida coincida con el número esperado de particiones SSD.

    Si usas dispositivos SCSI, utiliza el siguiente comando find:

    find /dev/ | grep google-local-ssd
    

    Todos los dispositivos NVMe deben tener el formato google-local-nvme-ssd-# y todos los dispositivos SCSI deben tener el formato google-local-ssd-#.

  4. Usa la herramienta mdadm para combinar varias unidades SSD locales en una sola matriz llamada /dev/md0. En el siguiente ejemplo se combinan 24 dispositivos SSD locales que usan la interfaz NVMe. En el caso de los dispositivos SSD local que usan SCSI, utiliza los nombres de dispositivo devueltos por el comando find del paso 3.

    sudo mdadm --create /dev/md0 --level=0 --raid-devices=24 \
    /dev/disk/by-id/google-local-nvme-ssd-0 \
    /dev/disk/by-id/google-local-nvme-ssd-1 \
    /dev/disk/by-id/google-local-nvme-ssd-2 \
    /dev/disk/by-id/google-local-nvme-ssd-3 \
    /dev/disk/by-id/google-local-nvme-ssd-4 \
    /dev/disk/by-id/google-local-nvme-ssd-5 \
    /dev/disk/by-id/google-local-nvme-ssd-6 \
    /dev/disk/by-id/google-local-nvme-ssd-7 \
    /dev/disk/by-id/google-local-nvme-ssd-8 \
    /dev/disk/by-id/google-local-nvme-ssd-9 \
    /dev/disk/by-id/google-local-nvme-ssd-10 \
    /dev/disk/by-id/google-local-nvme-ssd-11 \
    /dev/disk/by-id/google-local-nvme-ssd-12 \
    /dev/disk/by-id/google-local-nvme-ssd-13 \
    /dev/disk/by-id/google-local-nvme-ssd-14 \
    /dev/disk/by-id/google-local-nvme-ssd-15 \
    /dev/disk/by-id/google-local-nvme-ssd-16 \
    /dev/disk/by-id/google-local-nvme-ssd-17 \
    /dev/disk/by-id/google-local-nvme-ssd-18 \
    /dev/disk/by-id/google-local-nvme-ssd-19 \
    /dev/disk/by-id/google-local-nvme-ssd-20 \
    /dev/disk/by-id/google-local-nvme-ssd-21 \
    /dev/disk/by-id/google-local-nvme-ssd-22 \
    /dev/disk/by-id/google-local-nvme-ssd-23
    

    La respuesta es similar a la siguiente:

    mdadm: Defaulting to version 1.2 metadata
    mdadm: array /dev/md0 started.
    

    Puedes confirmar los detalles de la matriz con mdadm --detail. Si añade la marca --prefer=by-id, se mostrarán los dispositivos que usen las rutas /dev/disk/by-id.

     sudo mdadm --detail --prefer=by-id /dev/md0
    

    La salida debería ser similar a la siguiente para cada dispositivo de la matriz.

     ...
     Number   Major   Minor   RaidDevice State
     0     259        0        0      active sync   /dev/disk/by-id/google-local-nvme-ssd-0
     ...
    
  5. Ejecuta la siguiente secuencia de comandos en tu máquina virtual. La secuencia de comandos replica los ajustes utilizados para obtener las cifras de rendimiento de SSD que se indican en la sección de rendimiento. El parámetro --bs define el tamaño del bloque, lo que afecta a los resultados de los diferentes tipos de operaciones de lectura y escritura.

    # install tools
    sudo apt-get -y update
    sudo apt-get install -y fio util-linux
    
    # full write pass - measures write bandwidth with 1M blocksize
    sudo fio --name=writefile \
    --filename=/dev/md0 --bs=1M --nrfiles=1 \
    --direct=1 --sync=0 --randrepeat=0 --rw=write --end_fsync=1 \
    --iodepth=128 --ioengine=libaio
    
    # rand read - measures max read IOPS with 4k blocks
    sudo fio --time_based --name=benchmark  --runtime=30 \
    --filename=/dev/md0 --ioengine=libaio --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=48 --rw=randread --blocksize=4k --group_reporting --norandommap
    
    # rand write - measures max write IOPS with 4k blocks
    sudo fio --time_based --name=benchmark  --runtime=30 \
    --filename=/dev/md0 --ioengine=libaio --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=48 --rw=randwrite --blocksize=4k --group_reporting --norandommap
    

Comparativas de VMs optimizadas para almacenamiento

  1. Las máquinas virtuales con almacenamiento optimizado (como la familia Z3) deben compararse directamente con las particiones del dispositivo. Puedes obtener los nombres de las particiones con lsblk

    lsblk -o name,size -lpn | grep 2.9T | awk '{print $1}'
    

    El resultado es similar al siguiente:

    /dev/nvme1n1
    /dev/nvme2n1
    /dev/nvme3n1
    /dev/nvme4n1
    /dev/nvme5n1
    /dev/nvme6n1
    /dev/nvme7n1
    /dev/nvme8n1
    /dev/nvme9n1
    /dev/nvme10n1
    /dev/nvme11n1
    /dev/nvme12n1
    
  2. Ejecuta directamente las comparativas en las particiones de SSD locales separándolas con delimitadores de dos puntos.

    # install benchmarking tools
    sudo apt-get -y update
    sudo apt-get install -y fio util-linux
    
    # Full Write Pass.
    # SOVM achieves max read performance on previously written/discarded ranges.
    sudo  fio --readwrite=write --blocksize=1m --iodepth=4 --ioengine=libaio \
    --direct=1 --group_reporting \
    --name=job1 --filename=/dev/nvme1n1 --name=job2 --filename=/dev/nvme2n1 \
    --name=job3 --filename=/dev/nvme3n1 --name=job4 --filename=/dev/nvme4n1 \
    --name=job5 --filename=/dev/nvme5n1 --name=job6 --filename=/dev/nvme6n1 \
    --name=job7 --filename=/dev/nvme7n1 --name=job8 --filename=/dev/nvme8n1 \
    --name=job9 --filename=/dev/nvme9n1 --name=job10 --filename=/dev/nvme10n1 \
    --name=job11  --filename=/dev/nvme11n1 --name=job12 --filename=/dev/nvme12n1
    
    # rand read - measures max read IOPS with 4k blocks
    sudo fio --readwrite=randread --blocksize=4k --iodepth=128  \
    --numjobs=4 --direct=1 --runtime=30 --group_reporting  --ioengine=libaio \
    --name=job1 --filename=/dev/nvme1n1 --name=job2 --filename=/dev/nvme2n1 \
    --name=job3 --filename=/dev/nvme3n1 --name=job4 --filename=/dev/nvme4n1 \
    --name=job5 --filename=/dev/nvme5n1 --name=job6 --filename=/dev/nvme6n1 \
    --name=job7 --filename=/dev/nvme7n1 --name=job8 --filename=/dev/nvme8n1 \
    --name=job9 --filename=/dev/nvme9n1 --name=job10 --filename=/dev/nvme10n1 \
    --name=job11  --filename=/dev/nvme11n1 --name=job12 --filename=/dev/nvme12n1
    
    # rand write - measures max write IOPS with 4k blocks
    sudo fio --readwrite=randwrite --blocksize=4k --iodepth=128 \
    --numjobs=4 --direct=1 --runtime=30 --group_reporting --ioengine=libaio \
    --name=job1 --filename=/dev/nvme1n1 --name=job2 --filename=/dev/nvme2n1 \
    --name=job3 --filename=/dev/nvme3n1 --name=job4 --filename=/dev/nvme4n1 \
    --name=job5 --filename=/dev/nvme5n1 --name=job6 --filename=/dev/nvme6n1 \
    --name=job7 --filename=/dev/nvme7n1 --name=job8 --filename=/dev/nvme8n1 \
    --name=job9 --filename=/dev/nvme9n1 --name=job10 --filename=/dev/nvme10n1 \
    --name=job11  --filename=/dev/nvme11n1 --name=job12 --filename=/dev/nvme12n1
    

Siguientes pasos