Comparar o desempenho do disco permanente em uma VM do Linux


Para comparar o desempenho do disco permanente, use o Testador de E/S flexível (FIO, na sigla em inglês) em vez de outras ferramentas de comparação de disco, como dd Por padrão, dd usa uma profundidade de fila de E/S muito baixa. Portanto, é difícil garantir que a comparação esteja gerando um número suficiente de E/S e bytes para testar com precisão o desempenho do disco.

Além disso, os dispositivos especiais usados com dd geralmente são muito lentos e não refletem com precisão o desempenho do disco permanente. Em geral, evite usar dispositivos especiais como /dev/urandom, /dev/random e /dev/zero nos comparativos de mercado de desempenho do disco permanente.

Para medir IOPS e capacidade de um disco em uso em uma instância em execução, compare o sistema de arquivos com a configuração pretendida. Use essa opção para testar uma carga de trabalho realista sem perder o conteúdo do disco existente. Quando você compara o sistema de arquivos em um disco existente, há muitos fatores específicos para seu ambiente de desenvolvimento que podem afetar os resultados do comparativo de mercado, e talvez você não atinja os limites de desempenho do disco.

Para medir o desempenho bruto de um disco permanente, faça comparações diretas com o dispositivo em bloco. Use essa opção para comparar o desempenho do disco bruto com os limites de desempenho do disco.

Os comandos a seguir funcionam com sistemas operacionais Debian ou Ubuntu com o gerenciador de pacotes apt.

Comparativo de IOPS e capacidade de um disco em uma instância em execução

Se você quiser medir as IOPS e a capacidade de uma carga de trabalho realista em um disco ativo em uma instância em execução sem perder o conteúdo do disco, compare-o com um novo diretório no sistema de arquivos atual.

  1. Conecte-se à instância.

  2. Instale as dependências:

    sudo apt update
    sudo apt install -y fio
    
  3. No terminal, liste os discos anexados à VM e encontre o disco que você quer testar. Se o disco permanente ainda não estiver formatado, formate e ative o disco.

    sudo lsblk
    
    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda      8:0    0   10G  0 disk
    └─sda1   8:1    0   10G  0 part /
    sdb      8:32   0  2.5T  0 disk /mnt/disks/mnt_dir
    

    Neste exemplo, testamos um disco permanente SSD de 2.500 GB com o código do dispositivo sdb.

  4. Crie um novo diretório, fiotest, no disco. Neste exemplo, o disco é ativado em /mnt/disks/mnt_dir:

    TEST_DIR=/mnt/disks/mnt_dir/fiotest
    sudo mkdir -p $TEST_DIR
    
  5. Teste a capacidade de gravação realizando gravações sequenciais com vários streams paralelos (16+), usando um tamanho de bloco de E/S de 1 MB e uma profundidade de E/S de pelo menos 64:

    sudo fio --name=write_throughput --directory=$TEST_DIR --numjobs=16 \
    --size=10G --time_based --runtime=60s --ramp_time=2s --ioengine=libaio \
    --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
    --group_reporting=1 --iodepth_batch_submit=64 \
    --iodepth_batch_complete_max=64
    
  6. Teste as IOPS de gravação executando gravações aleatórias, usando um tamanho de bloco de E/S de 4 KB e uma profundidade de E/S de pelo menos 256:

     sudo fio --name=write_iops --directory=$TEST_DIR --size=10G \
    --time_based --runtime=60s --ramp_time=2s --ioengine=libaio --direct=1 \
    --verify=0 --bs=4K --iodepth=256 --rw=randwrite --group_reporting=1  \
    --iodepth_batch_submit=256  --iodepth_batch_complete_max=256
    
  7. Teste a capacidade de leitura executando leituras sequenciais com vários streams paralelos (16+), usando um tamanho de bloco de E/S de 1 MB e uma profundidade de E/S de pelo menos 64:

    sudo fio --name=read_throughput --directory=$TEST_DIR --numjobs=16 \
    --size=10G --time_based --runtime=60s --ramp_time=2s --ioengine=libaio \
    --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
    --group_reporting=1 \
    --iodepth_batch_submit=64 --iodepth_batch_complete_max=64
    
  8. 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:

    sudo fio --name=read_iops --directory=$TEST_DIR --size=10G \
    --time_based --runtime=60s --ramp_time=2s --ioengine=libaio --direct=1 \
    --verify=0 --bs=4K --iodepth=256 --rw=randread --group_reporting=1 \
    --iodepth_batch_submit=256  --iodepth_batch_complete_max=256
    
  9. Limpeza:

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

Comparativo do desempenho do disco permanente bruto

Se você quiser medir o desempenho de discos permanentes sozinhos fora do ambiente de desenvolvimento, teste o desempenho de leitura e gravação de um dispositivo de bloco em um disco permanente descartável e VM.

Os comandos a seguir pressupõem um disco permanente SSD de 2.500 GB anexado à VM. Se o tamanho do dispositivo for diferente, modifique o valor do argumento --filesize. Esse tamanho de disco é necessário para alcançar os limites de capacidade da VM de 32  vCPUs. Para mais informações, consulte Desempenho do armazenamento em blocos.

  1. Conecte-se à instância.

  2. Instale as dependências:

    sudo apt-get update
    sudo apt-get install -y fio
    
  3. Preencha o disco com dados diferentes de zero. As leituras de disco permanente em blocos vazios têm um perfil de latência diferente dos que contêm dados. Recomendamos que você preencha o disco antes de executar qualquer comparação 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=/dev/sdb --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
    
  4. Teste a largura de banda de gravação ao executar gravações sequenciais com vários streams paralelos (16 ou mais). Eles precisam ter 1 MB como tamanho de E/S e uma profundidade de E/S igual ou superior a 64.

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    sudo fio --name=write_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=1M --iodepth=64  --iodepth_batch_submit=64  --iodepth_batch_complete_max=64 \
      --rw=write --numjobs=16 --offset_increment=100G
    
  5. Teste as IOPS de gravação. Para alcançar o limite de IOPS do DP, é importante manter uma fila profunda de E/S. Por exemplo, quando a latência de gravação for de 1 milissegundo, a VM poderá ter no máximo 1.000 IOPS para cada E/S em execução. Para alcançar 15.000 IOPS de gravação, a VM terá que manter pelo menos 15 E/S em execução. Se o disco e a VM conseguirem 30.000 IOPS de gravação, o número de E/Ss em execução precisará ser de pelo menos 30 E/S. Quando o tamanho da E/S for maior do que 4 KB, a VM poderá alcançar o limite de largura de banda antes de alcançar o de IOPS.

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    sudo fio --name=write_iops_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=256 --rw=randwrite \
      --iodepth_batch_submit=256  --iodepth_batch_complete_max=256
    
  6. Teste a latência de gravação. Durante o teste da latência de E/S, é importante que a VM não alcance o limite de largura de banda ou de IOPS. Caso contrário, a latência de E/S real do disco permanente não será refletida. Por exemplo, se o limite de IOPS for alcançado em uma profundidade de E/S de 30, e o comando fio tiver o dobro disso, o total de IOPS permanecerá igual, e a latência de E/S relatada dobrará.

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    sudo fio --name=write_latency_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=4 --rw=randwrite --iodepth_batch_submit=4  \
      --iodepth_batch_complete_max=4
    
  7. Teste a largura de banda de leitura ao executar leituras sequenciais com vários streams paralelos (16 ou mais). Eles precisam ter 1 MB como tamanho de E/S e uma profundidade de E/S igual ou superior a 64.

    sudo fio --name=read_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=1M --iodepth=64 --rw=read --numjobs=16 --offset_increment=100G \
      --iodepth_batch_submit=64  --iodepth_batch_complete_max=64
    
  8. Teste as IOPS de leitura. Para alcançar o limite de IOPS do DP, é importante manter uma fila profunda de E/S. Por exemplo, se o tamanho de E/S for maior do que 4 KB, a VM poderá alcançar o limite de largura de banda antes de alcançar o de IOPS. Para alcançar o máximo de 100 mil IOPS de leitura, especifique --iodepth=256 para este teste.

    sudo fio --name=read_iops_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=256 --rw=randread \
      --iodepth_batch_submit=256  --iodepth_batch_complete_max=256
    
  9. Teste a latência de leitura. É importante preencher o disco com dados para receber uma medição de latência realista. É importante que a VM não atinja os limites de IOPS ou de capacidade durante este teste, porque após o disco permanente atingir o limite de saturação, ele retornará as E/Ss recebidas, o que se refletirá como um aumento artificial na latência de E/S.

    sudo fio --name=read_latency_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=4 --rw=randread \
      --iodepth_batch_submit=4  --iodepth_batch_complete_max=4
    
  10. Teste a largura de banda de leitura sequencial.

    sudo fio --name=read_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --numjobs=4 --thread --offset_increment=500G \
      --bs=1M --iodepth=64 --rw=read \
      --iodepth_batch_submit=64  --iodepth_batch_complete_max=64
    
  11. Teste a largura de banda de gravação sequencial.

    sudo fio --name=write_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --numjobs=4 --thread --offset_increment=500G \
      --bs=1M --iodepth=64 --rw=write \
      --iodepth_batch_submit=64  --iodepth_batch_complete_max=64
    

A seguir