Teste de referência do desempenho do Hyperdisk


Para comparar o desempenho do Google Cloud Hyperdisk, use o Flexible I/O tester (FIO) em vez de outras ferramentas de comparação de discos, como o dd. Por predefinição, o dd usa uma profundidade da fila de E/S muito baixa, pelo que é difícil garantir que a referência está a gerar um número suficiente de bytes e operações de E/S para testar com precisão o desempenho do disco.

Além disso, os dispositivos especiais usados com o dd são frequentemente muito lentos e não refletem com precisão o desempenho do disco. Em geral, evite usar dispositivos especiais, como /dev/urandom, /dev/random e /dev/zero, nas suas referências de desempenho do Hyperdisk.

Para medir os IOPS e o débito de um disco em utilização numa instância em execução, teste o desempenho do sistema de ficheiros com a configuração pretendida. Use esta opção para testar uma carga de trabalho realista sem perder o conteúdo do disco existente. Tenha em atenção que, quando compara o desempenho do sistema de ficheiros num disco existente, existem muitos fatores específicos do seu ambiente de desenvolvimento que podem afetar os resultados da comparação do desempenho e pode não atingir os limites de desempenho do disco.

Para medir o desempenho não processado de um Hyperdisk, faça testes de referência do dispositivo de blocos diretamente. Use esta opção para comparar o desempenho do disco não processado com os limites de desempenho do Hyperdisk.

Os seguintes comandos funcionam com sistemas operativos Debian ou Ubuntu com o gestor de pacotes apt.

Testes de referência de IOPS e débito de um disco numa instância em execução

Se quiser medir as IOPS e a taxa de transferência para uma carga de trabalho realista num disco ativo numa instância de VM em execução sem perder o conteúdo do disco, faça um teste de benchmark em relação a um novo diretório no sistema de ficheiros existente.

Prepare-se para os testes

  1. Ligue-se à sua instância.

  2. Instalar dependências:

    sudo apt update
    sudo apt install -y fio
    
  3. Se o volume do Hyperdisk ainda não estiver formatado, formate e monte o disco.

  4. No terminal, liste os discos anexados à sua VM e encontre o disco que quer testar.

    sudo lsblk
    

    O comando anterior produz um resultado semelhante ao seguinte:

    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
    

    Neste exemplo, estamos a testar um volume Hyperdisk Extreme de 3500 GiB com o nome do dispositivo nvme0n2.

  5. Crie um novo diretório, fiotest, no disco. Neste exemplo, o disco está montado em /mnt/disks/mnt_dir:

    TEST_DIR=/mnt/disks/mnt_dir/fiotest
    sudo mkdir -p $TEST_DIR
    
  6. Se a VM usar a interface de disco NVMe para a associação do volume Hyperdisk (se o nome do disco não processado tiver o prefixo nvme), execute os passos seguintes para obter o número de nós NUMA disponíveis para a VM.

    A estratégia de testes de referência para discos NVMe difere para VMs com apenas um nó NUMA e VMs com mais de um nó NUMA. Quando testa o desempenho do Hyperdisk através da interface de disco NVMe, são alocados apenas 256 tamanhos de filas NVMe por fila. Devido aos tamanhos das filas NVMe limitados disponíveis e à potencial contenção proveniente dos outros discos anexados à mesma VM, estes testes de benchmark usam duas filas de discos NVMe para manter um tamanho da fila agregado capaz de processar a profundidade de E/S de 256.

    1. Obtenha o número de nós NUMA.

      lscpu | grep -i 'numa node(s)' | awk '{print $NF}'
      
    2. Se a VM tiver apenas 1 nó NUMA, obtenha o mapeamento da fila CPU para NVMe. Vai usar estas informações mais tarde para o 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")
      

Testar a taxa de gravações

Teste a taxa de transferência de gravação realizando gravações sequenciais com vários fluxos paralelos (mais de 16), usando um tamanho de bloco de E/S de 1 MB e uma profundidade de E/S de, pelo menos, 64.

  1. Se o volume do Hyperdisk usar a interface 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. Se o volume do Hyperdisk usar a interface NVMe:

    1. Se a VM tiver apenas um nó NUMA, use o seguinte 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. Se a VM tiver mais do que um nó NUMA, use o seguinte 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
      

IOPS de gravação de teste

Teste as IOPS de escrita realizando escritas aleatórias, usando um tamanho de bloco de E/S de 4 KB e uma profundidade de E/S de, pelo menos, 256.

  1. Se o volume do Hyperdisk estiver associado através da interface 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=randwrite \
    --iodepth_batch_submit=256  --iodepth_batch_complete_max=256 \
    --name=write_iops
    
  2. Se o volume do Hyperdisk usar a interface NVMe:

    1. Se a VM tiver apenas um nó NUMA, use o seguinte 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. Se a VM tiver mais do que um nó NUMA, use o seguinte 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
      

Teste a taxa de transferência de leitura

Teste a taxa de transferência de leitura executando leituras sequenciais com vários fluxos paralelos (mais de 16), usando um tamanho de bloco de E/S de 1 MB e uma profundidade de E/S de, pelo menos, 64.

  1. Se o volume do Hyperdisk usar a interface 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. Se o volume do Hyperdisk usar a interface NVMe:

    1. Se a VM tiver apenas um nó NUMA, use o seguinte 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. Se a VM tiver mais do que um nó NUMA, use o seguinte 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
      

IOPS de leitura de teste

Teste as IOPS de leitura executando leituras aleatórias, usando um tamanho de bloco de E/S de 4 KB e uma profundidade de E/S de, pelo menos, 256.

  1. Se o volume do Hyperdisk usar a interface 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. Se o volume do Hyperdisk usar a interface NVMe:

    1. Se a VM tiver apenas um nó NUMA, use o seguinte 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. Se a VM tiver mais do que um nó NUMA, use o seguinte 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
      

Limpar

Remova os diretórios de teste.

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

Testes de referência de IOPS e débito para o Hyperdisk Extreme em VMs C3

O Google Cloud Hyperdisk Extreme oferece um desempenho superior em VMs C3 com 176 vCPUs. Para alcançar os limites de desempenho mais elevados, tem de associar vários volumes Hyperdisk Extreme à VM.

Para medir as E/S por segundo (IOPS) ou a taxa de transferência para uma carga de trabalho realista em discos ativos numa VM C3 em execução sem perder o conteúdo dos discos de dados existentes, faça testes de referência em relação a um novo diretório no sistema de ficheiros existente e anexe novos volumes Hyperdisk Extreme à VM para as tarefas de testes de referência.

Para discos anexados com a interface NVMe, recomenda-se que distribua a carga de trabalho de E/S por todas as filas NVMe disponíveis para a VM. Isto maximiza o desempenho do volume do Hyperdisk. Nas VMs C3 com 176 vCPUs, existem quatro nós NUMA mapeados individualmente para quatro filas NVMe. Esta associação é assumida para os testes de referência nesta secção.

Prepare-se para os testes

  1. Adicione novos discos Hyperdisk Extreme à sua VM, e consulte os limites de desempenho do Hyperdisk para determinar a configuração do disco necessária para o desempenho pretendido.

  2. Associe-se à sua instância:

  3. Instalar dependências:

    sudo apt update
    sudo apt install -y fio
    
  4. Liste os discos associados à sua VM e encontre o disco que quer testar.

    sudo lsblk
    

    O comando anterior produz um resultado semelhante ao seguinte:

    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
    

    Neste exemplo, estamos a testar o desempenho do Google Cloud Hyperdisk em três volumes Hyperdisk Extreme de 2500 GiB com dispositivos denominados nvme0n2, nvme0n3 e nvme0n4.

Teste de débito do Hyperdisk Extreme no C3

Esta secção mostra como realizar testes de referência do débito de leitura e gravação para discos Hyperdisk Extreme.

Preparação para testes

Antes de começar a realizar testes de referência do desempenho dos discos Hyperdisk Extreme associados a uma VM C3 com 176 vCPUs, conclua os seguintes passos.

  1. Crie um novo diretório, fiotest, no seu sistema operativo. Neste exemplo, o diretório raiz é /mnt/disks/mnt_dir:

    TEST_DIR=/mnt/disks/mnt_dir/fiotest
    sudo mkdir -p $TEST_DIR
    
  2. Uma vez que a VM requer mais do que um disco para atingir os níveis de desempenho mais elevados, para simplificar, execute o RAID 0 em todos os volumes Hyperdisk anexados. Isto facilita a distribuição uniforme dos dados por vários volumes do Hyperdisk.

    Neste exemplo, o RAID 0 é o desempenho em três volumes do Hyperdisk Extreme anexados à VM C3.

    sudo mdadm --create /dev/md0 --level=0 --raid-devices=3 /dev/nvme0n2 /dev/nvme0n3 /dev/nvme0n4
    
  3. Formate e monte o volume RAID /dev/md0.

Testar a taxa de gravações

Teste a taxa de transferência de escrita executando escritas sequenciais com várias streams paralelas (pelo menos 16), usando um tamanho de bloco de E/S de 1 MiB e uma profundidade de E/S total de, pelo menos, 32 por fila 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

Teste a taxa de transferência de leitura

Teste a taxa de transferência de leitura executando leituras sequenciais com várias streams paralelas (pelo menos 16), usando um tamanho de bloco de E/S de 1 MiB e uma profundidade de E/S total de, pelo menos, 32 por fila 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

Teste de referência de IOPS do Hyperdisk Extreme no C3

Para realizar testes de referência para o desempenho de I/O por segundo (IOPS), recomendamos que execute operações de I/O pequenas paralelas diretamente para ou a partir de discos não processados (sem RAID).

IOPS de gravação de teste

Teste as IOPS de escrita executando escritas aleatórias, usando um tamanho de bloco de E/S de 4 KiB e uma profundidade de E/S de, pelo menos, 256, usando, pelo menos, 2 filas 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

IOPS de leitura de teste

Teste as IOPS de leitura fazendo leituras aleatórias, usando um tamanho de bloco de E/S de 4 KiB e uma profundidade de E/S de, pelo menos, 256, usando, pelo menos, 2 filas 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

Teste de referência da latência do Hyperdisk Extreme no C3

Durante o teste da latência de E/S, a VM não pode atingir a largura de banda máxima nem os IOPS. Se o fizer, a latência observada não reflete a latência de E/S do Hyperdisk real. Por exemplo, se a VM atingir o limite de IOPS a uma profundidade de E/S de 30 e o comando fio tiver duplicado esse valor, o total de IOPS permanece igual e a latência de E/S comunicada duplica.

É suficiente segmentar um único dispositivo de disco não processado diretamente para obter latências de E/S realistas.

Latência de gravação de teste

Teste a latência de escrita executando escritas aleatórias, usando um tamanho de bloco de E/S de 4 KiB e uma profundidade 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

Teste a latência de leitura

Teste a latência de leitura executando leituras aleatórias, usando um tamanho de bloco de E/S de 4 KiB e uma profundidade 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

Limpar

  1. Remova os ficheiros de teste.

    sudo rm -rf $TEST_DIR/*
    
  2. Desmonte e pare o volume RAID.

    sudo umount /dev/md0
    sudo mdadm --stop /dev/md0
    
  3. Desassocie e elimine os volumes Hyperdisk anexados. Consulte os comandos gcloud compute instances detach-disk e gcloud compute disks delete.

Testes de referência do desempenho bruto do Hyperdisk

Se quiser medir o desempenho dos volumes do Hyperdisk sozinhos, fora do seu ambiente de desenvolvimento, pode testar o desempenho de leitura e escrita de um dispositivo de blocos num disco e numa VM descartáveis.

Os comandos seguintes pressupõem um volume Hyperdisk Extreme de 3500 GiB anexado à sua VM. Este tamanho do disco é necessário para atingir os limites de débito da VM de 32 vCPUs. Se o tamanho do dispositivo for diferente, modifique o valor do argumento --filesize nos seguintes comandos. Para mais informações sobre os limites de desempenho dos tipos de máquinas de VMs, consulte o artigo Suporte de tipos de máquinas.

Prepare-se para os testes

  1. Ligue-se à sua instância.

  2. Instalar dependências:

    sudo apt-get update
    sudo apt-get install -y fio
    
  3. Obtenha o caminho para o disco não processado. Armazene o caminho numa variável. O exemplo seguinte usa /dev/nvme0n2 como o caminho do disco não processado:

    TEST_DIR=/dev/nvme0n2
    
  4. Preencha o disco com dados diferentes de zero. As leituras do Hyperdisk a partir de blocos vazios têm um perfil de latência diferente dos blocos que contêm dados. Recomendamos que encha o disco antes de executar quaisquer testes de referência de latência de leitura.

    # 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. Se a VM usar a interface de disco NVMe para a ligação do Hyperdisk (se o nome do disco não processado tiver o prefixo nvme), siga os passos abaixo para obter o número de nós NUMA disponíveis para a VM.

    A estratégia de testes de referência para discos NVMe difere para VMs com apenas um nó NUMA e VMs com mais de um nó NUMA. Quando testa o desempenho do Hyperdisk através da interface de disco NVMe, apenas são alocados 256 tamanhos de filas NVMe por fila. Devido aos tamanhos de filas NVMe limitados disponíveis e à potencial contenção proveniente dos outros discos anexados à mesma VM, estes testes de benchmark usam duas filas de discos NVMe para manter um tamanho de fila agregado capaz de processar a profundidade de E/S de 256.

    1. Obtenha o número de nós NUMA.

      lscpu | grep -i 'numa node(s)' | awk '{print $NF}'
      
    2. Se a VM tiver apenas 1 nó NUMA, obtenha o mapeamento da fila CPU para NVMe. Vai usar estas informações mais tarde para o 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")
      

Testar a taxa de gravações

Teste a taxa de transferência de gravação executando gravações sequenciais com vários fluxos paralelos (mais de 16), usando 1 MB como o tamanho de E/S e tendo uma profundidade de E/S igual ou superior a 64.

  1. Se o Hyperdisk estiver anexado através da interface SCSI:

    # 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. Se o volume do Hyperdisk usar a interface NVMe:

    1. Se a VM tiver apenas um nó NUMA, use o seguinte 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. Se a VM tiver mais do que um nó NUMA, use o seguinte 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
      

IOPS de gravação de teste

Para alcançar o máximo de IOPS do Hyperdisk, tem de manter uma fila de E/S profunda. Se, por exemplo, a latência de escrita for de 1 milissegundo, a VM pode atingir, no máximo, 1000 IOPS para cada E/S em voo. Para alcançar 15 000 IOPS de escrita, a VM tem de manter, pelo menos, 15 operações de E/S em curso. Se o disco e a VM puderem atingir 30 000 IOPS de escrita, o número de operações de E/S em curso tem de ser, pelo menos, 30. Se o tamanho de E/S for superior a 4 KB, a VM pode atingir o limite de largura de banda antes de atingir o limite de IOPS.

Teste as IOPS de escrita realizando escritas aleatórias, usando um tamanho de bloco de E/S de 4 KB e uma profundidade de E/S de, pelo menos, 256.

  1. Se o volume do Hyperdisk Extreme estiver associado através da interface SCSI:

    # 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. Se o volume do Hyperdisk Extreme estiver associado através da interface NVMe:

    1. Se a VM tiver apenas um nó NUMA, use o seguinte 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. Se a VM tiver mais do que um nó NUMA, use o seguinte 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
      

Latência de gravação de teste

Durante o teste da latência de E/S, a VM não pode atingir a largura de banda máxima nem os IOPS. Caso contrário, a latência observada não reflete a latência de E/S do Hyperdisk real. Por exemplo, se o limite de IOPS for atingido a uma profundidade de E/S de 30 e o comando fio tiver duplicado esse valor, o total de IOPS permanece o mesmo e a latência de E/S comunicada duplica.

# 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

Teste a largura de banda de leitura

Teste a largura de banda de leitura executando leituras sequenciais com vários fluxos paralelos (mais de 16), usando um tamanho de E/S de 1 MB e uma profundidade de E/S de, pelo menos, 64.

  1. Se o volume do Hyperdisk Extreme estiver associado através da interface SCSI:

     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. Se o volume do Hyperdisk Extreme estiver associado através da interface NVMe:

    1. Se a VM tiver apenas um nó NUMA, use o seguinte 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. Se a VM tiver mais do que um nó NUMA, use o seguinte 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

IOPS de leitura de teste

Para alcançar o máximo de IOPS do Hyperdisk, tem de manter uma fila de E/S profunda. Se, por exemplo, o tamanho de E/S for superior a 4 KB, a VM pode atingir o limite de largura de banda antes de atingir o limite de IOPS. Para alcançar o máximo de IOPS de leitura disponíveis para um tipo de máquina, especifique --iodepth=256 para este teste.

  1. Se o volume do Hyperdisk Extreme estiver associado através da interface SCSI:

    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. Se o volume do Hyperdisk Extreme estiver associado através da interface NVMe:

    1. Se a VM tiver apenas um nó NUMA, use o seguinte 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. Se a VM tiver mais do que um nó NUMA, use o seguinte 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
      

Teste a latência de leitura

É importante encher o disco com dados para obter uma medição de latência realista. É importante que a VM não atinja os limites de IOPS ou débito durante este teste, porque, depois de o volume do Hyperdisk atingir o limite de saturação, rejeita as operações de E/S recebidas. Esta rejeição reflete-se como um aumento artificial na latência 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

Limpar

Se usou um disco e uma VM descartáveis, conforme recomendado, após a conclusão dos testes de benchmark, pode:

  • Desanexe e elimine o disco.
  • Elimine a VM.

O que se segue?