Haz una evaluación comparativa del rendimiento del SSD local


Los límites de rendimiento del SSD local que se proporcionan en la sección Elige una opción de almacenamiento se obtuvieron mediante una configuración específica 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 configuraste mediante la configuración de SSD local recomendada, puedes hacer lo siguiente: compara los límites del rendimiento con los límites publicados. Para ello, replica la configuración que usa el equipo de Compute Engine.

En estas instrucciones, se supone que usas un sistema operativo Linux con el administrador de paquetes apt instalado.

Crea una VM con un dispositivo SSD local

La cantidad de SSD locales que puede tener una VM se basa en el tipo de máquina que usas para crear la VM. Para obtener más información, consulta Elige una cantidad válida de SSD locales.

  1. Crea una instancia de SSD local con cuatro o con ocho CPU virtuales para cada dispositivo, según la carga de trabajo.

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

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

    En el caso de los tipos de máquinas de segunda generación y anteriores, debes especificar la cantidad de SSD locales para conectar a la VM mediante la marca --local-ssd. Con el siguiente comando, se crea una VM N2 con 8 CPU virtuales 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 VM. La secuencia de comandos replica la configuración que se usó para alcanzar las cifras de rendimiento del SSD proporcionadas en la sección sobre rendimiento. Ten en cuenta que el parámetro --bs define el tamaño del bloque, el cual afecta los resultados para los diferentes 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
    

Crea una VM con la cantidad máxima 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 CPU virtuales o más.

    Los siguientes comandos crean una VM con la cantidad máxima permitida de discos SSD locales mediante la interfaz NVMe:

    Adjunta SSD local a 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
    

    Usa tipos de máquina -lssd

    Las series de máquinas más recientes ofrecen tipos de máquinas -lssd que vienen con una cantidad predeterminada de discos SSD locales. Por ejemplo, para comparar una VM con 32 SSD locales (capacidad de 12 TiB), usa el siguiente comando:

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

    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 todos los SSD locales que quieras activar juntos:

    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. Está bien que los dispositivos aparezcan en un orden diferente, siempre que la cantidad de líneas del resultado coincida con la cantidad esperada de particiones SSD.

    Si usas dispositivos SCSI, usa el siguiente comando find:

    find /dev/ | grep google-local-ssd
    

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

  4. Usa la herramienta de mdadm para combinar varios dispositivos SSD locales en un solo array llamado /dev/md0. En el siguiente ejemplo, se combinan veinticuatro dispositivos SSD locales que usan la interfaz NVMe. Para dispositivos SSD locales que usan SCSI, usa los nombres de dispositivos que muestra el comando find en el 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 al ejemplo a continuación:

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

    Puedes confirmar los detalles del array con mdadm --detail. Agrega la marca --prefer=by-id para que se muestren los dispositivos que usan las rutas /dev/disk/by-id.

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

    El resultado debería ser similar al siguiente para cada dispositivo del array.

     ...
     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 VM. La secuencia de comandos replica la configuración que se usó para alcanzar las cifras de rendimiento del SSD proporcionadas en la sección sobre rendimiento. Ten en cuenta que el parámetro --bs define el tamaño de bloque, que afecta los resultados para 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=32 --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=32 --rw=randwrite --blocksize=4k --group_reporting --norandommap
    

Comparativas de las VMs optimizadas para almacenamiento

  1. Las VMs optimizadas para almacenamiento (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 las comparativas directamente en las particiones de SSD locales. Para ello, sepáralas 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
    

¿Qué sigue?