Evaluación comparativa del rendimiento de SSD local


Los límites de rendimiento de SSD local proporcionados en la sección Elegir una opción de almacenamiento se lograron mediante el uso de configuraciones específicas en la instancia de SSD local. Si la instancia de su máquina virtual (VM) tiene problemas para alcanzar estos límites de rendimiento y ya configuró la instancia usando la configuración SSD local recomendada , puede comparar sus límites de rendimiento con los límites publicados replicando la configuración utilizada por el equipo de Compute Engine.

Estas instrucciones asumen que está utilizando un sistema operativo Linux con el administrador de paquetes apt instalado.

Cree una máquina virtual con un dispositivo SSD local

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

  1. Cree una instancia de SSD local que tenga cuatro u ocho vCPU para cada dispositivo, según su carga de trabajo.

    Por ejemplo, el siguiente comando crea una máquina virtual C3 con 4 vCPU y 1 SSD local.

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

    Para tipos de máquinas de segunda generación y anteriores, especifique la cantidad de SSD locales que se conectarán a la máquina virtual mediante el indicador --local-ssd . El siguiente comando crea una máquina virtual N2 con 8 vCPU y 1 SSD local que utiliza la interfaz de disco NVMe:

    gcloud compute instances create ssd-test-instance \
        --machine-type "n2-standard-8" \
        --local-ssd interface=nvme
    
  2. Ejecute el siguiente script en su VM. El script replica la configuración utilizada para lograr las cifras de rendimiento de SSD proporcionadas en la sección de rendimiento . Tenga en cuenta que el parámetro --bs define el tamaño del bloque, lo que afecta los resultados de 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
    

Cree una VM con la cantidad máxima de SSD locales

  1. Si desea conectar 24 o más dispositivos SSD locales a una instancia, utilice un tipo de máquina con 32 o más vCPU.

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

    Adjuntar 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
    

    Utilice tipos de máquinas -lssd

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

    gcloud compute instances create ssd-test-instance \
        --machine-type "c3-standard-176-lssd"
    
  2. Instale la herramienta mdadm . El proceso de instalación de mdadm incluye un mensaje de usuario que detiene los scripts, así que ejecute 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. Utilice el comando find para identificar todos los SSD locales que desea montar 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 pedido. Está bien si los dispositivos aparecen en un orden diferente, siempre y cuando el número de líneas de salida coincida con el número esperado de particiones SSD.

    Si utiliza dispositivos SCSI, utilice 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. Utilice la herramienta mdadm para combinar varios dispositivos SSD locales en una única matriz denominada /dev/md0 . El siguiente ejemplo combina veinticuatro dispositivos SSD locales que utilizan la interfaz NVMe. Para dispositivos SSD locales que usan SCSI, use los nombres de dispositivo devueltos por 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 a la siguiente:

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

    Puede confirmar los detalles de la matriz con mdadm --detail . Agregar el indicador --prefer=by-id enumerará los dispositivos que utilizan 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 de la matriz.

     ...
     Number   Major   Minor   RaidDevice State
     0     259        0        0      active sync   /dev/disk/by-id/google-local-nvme-ssd-0
     ...
    
  5. Ejecute el siguiente script en su VM. El script replica la configuración utilizada para lograr las cifras de rendimiento de SSD proporcionadas en la sección de rendimiento . que el parámetro --bs define el tamaño del bloque, lo que afecta los resultados para 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
    

Evaluación comparativa de máquinas virtuales optimizadas para almacenamiento

  1. Las máquinas virtuales 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. Ejecute directamente los puntos de referencia contra las particiones 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
    

¿Qué sigue?