Teste o desempenho do disco persistente numa VM do Linux


Este documento descreve como realizar testes de referência do desempenho do disco persistente em máquinas virtuais (VMs) Linux. Para VMs do Windows, consulte o artigo Teste o desempenho do disco persistente numa VM do Windows.

Para comparar o desempenho do Persistent Disk no Linux, 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 e pode não testar com precisão o desempenho do disco. Em geral, evite usar dispositivos especiais, como /dev/urandom, /dev/random e /dev/zero, nos testes de desempenho do disco persistente.

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 bruto de um disco persistente, compare o dispositivo de blocos diretamente. Use esta opção para comparar o desempenho do disco não processado com os limites de desempenho do disco.

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 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. Cada teste fio é executado durante cinco minutos.

  1. Ligue-se à sua instância.

  2. Instalar dependências:

    sudo apt update
    sudo apt install -y fio
    
  3. No terminal, liste os discos anexados à sua VM e encontre o disco que quer testar. Se o disco persistente ainda não estiver formatado, formate e monte 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 persistente SSD de 2500 GB com o ID do dispositivo sdb.

  4. 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
    
  5. Teste a taxa de transferência de escrita realizando escritas 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:

    sudo fio --name=write_throughput --directory=$TEST_DIR --numjobs=16 \
    --size=10G --time_based --runtime=5m --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 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:

     sudo fio --name=write_iops --directory=$TEST_DIR --size=10G \
    --time_based --runtime=5m --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 o débito 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:

    sudo fio --name=read_throughput --directory=$TEST_DIR --numjobs=16 \
    --size=10G --time_based --runtime=5m --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 fazendo 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=5m --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. Limpar:

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

Testes de referência do desempenho do disco persistente não processado

Se quiser medir o desempenho dos discos persistentes sozinhos fora do seu ambiente de desenvolvimento, teste o desempenho de leitura e escrita de um dispositivo de blocos num disco persistente e numa VM descartáveis. Cada teste fio é executado durante cinco minutos. Os seguintes comandos pressupõem um disco persistente SSD de 2500 GB anexado à sua VM. Se o tamanho do dispositivo for diferente, modifique o valor do argumento --filesize. Este tamanho do disco é necessário para atingir os limites de débito da VM de 32 vCPU. Para mais informações, consulte o artigo Desempenho do armazenamento de blocos.

  1. Criar e iniciar uma instância de VM.

  2. Adicione um disco persistente à instância de VM que pretende testar.

  3. Ligue-se à sua instância.

  4. Instalar dependências:

    sudo apt-get update
    sudo apt-get install -y fio
    
  5. Preencha o disco com dados diferentes de zero. As leituras de discos persistentes 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=/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
    
  6. Teste a largura de banda de gravação fazendo 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.

    # 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=5m \
      --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
    
  7. IOPS de gravação de teste. Para alcançar o máximo de IOPS de PD, tem de manter uma fila de E/S profunda. Por exemplo, se a latência de escrita for de 1 milissegundo, a VM pode atingir, no máximo, 1000 IOPS para cada E/S em curso. Para alcançar 15 000 IOPS de gravação, a VM tem de manter, pelo menos, 15 E/S em curso. Se o disco e a VM conseguirem alcançar 30 000 IOPS de gravação, o número de E/S em curso tem de ser, pelo menos, 30 E/S. 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.

    # 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=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=256 --rw=randwrite \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256
    
  8. Teste a latência de escrita. Durante o teste da latência de E/S, a VM não deve 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 disco persistente real. Por exemplo, se o limite de IOPS for atingido a uma profundidade de E/S de 30 e o comando fio tiver o dobro, o total de IOPS permanece igual 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 --name=write_latency_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=4 --rw=randwrite --iodepth_batch_submit=4 \
      --iodepth_batch_complete_max=4
    
  9. Teste a largura de banda de leitura fazendo leituras 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.

    sudo fio --name=read_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --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
    
  10. Teste as IOPS de leitura. Para alcançar o máximo de IOPS de PD, 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 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=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=256 --rw=randread \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256
    
  11. Teste a latência de leitura. É importante preencher o disco com dados para obter uma medição de latência realista. É importante que a VM não atinja os limites de IOPS nem de débito durante este teste, porque, depois de o disco persistente atingir o limite de saturação, rejeita as E/S recebidas, o que se reflete num aumento artificial da latência de E/S.

    sudo fio --name=read_latency_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=4 --rw=randread \
      --iodepth_batch_submit=4 --iodepth_batch_complete_max=4
    
  12. 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=5m \
      --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
    
  13. Teste a largura de banda de escrita sequencial.

    sudo fio --name=write_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=5m \
      --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
    
  14. Limpe o disco persistente e a VM descartáveis:

    1. Elimine o disco usado para testar o desempenho.
    2. Elimine a VM criada para testes de referência de desempenho.

O que se segue?