Compare o desempenho do disco permanente em uma VM Linux


Este documento descreve como avaliar o desempenho do disco permanente em máquinas virtuais (VMs) Linux. Para VMs do Windows, consulte Comparar o desempenho do disco persistente em uma VM do Windows .

Para avaliar o desempenho do disco permanente no Linux, use o testador de E/S flexível (FIO) em vez de outras ferramentas de benchmarking de disco, como dd . Por padrão, dd usa uma profundidade de 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 benchmarks de desempenho do disco permanente.

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

Para medir o desempenho bruto de um disco permanente , compare diretamente o dispositivo de bloco. Use esta opção para comparar o desempenho bruto do disco com os limites de desempenho do disco .

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

Comparação de IOPS e taxa de transferência de um disco em uma instância em execução

Se você quiser medir o IOPS e a taxa de transferência para uma carga de trabalho realista em um disco ativo em uma instância em execução sem perder o conteúdo do disco, compare com um novo diretório no sistema de arquivos existente. Cada teste fio dura cinco minutos.

  1. Conecte-se à sua instância .

  2. Instale dependências:

    sudo apt update
    sudo apt install -y fio
    
  3. No terminal, liste os discos anexados à sua VM e encontre o disco que deseja testar. Se o seu disco permanente 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 permanente SSD de 2.500 GB com ID de dispositivo sdb .

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

    TEST_DIR=/mnt/disks/mnt_dir/fiotest
    sudo mkdir -p $TEST_DIR
    
  5. Teste o rendimento de gravação executando gravações sequenciais com vários fluxos 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=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 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=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 rendimento de leitura realizando leituras sequenciais com vários fluxos 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=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 IOPS de leitura realizando 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*
    

Avaliação comparativa do desempenho bruto do disco permanente

Se você quiser medir o desempenho apenas de discos permanentes 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 em uma VM. Cada teste fio dura cinco minutos. Os comandos a seguir pressupõem um disco permanente SSD de 2.500 GB anexado à sua VM. Se o tamanho do seu dispositivo for diferente, modifique o valor do argumento --filesize . Esse tamanho de disco é necessário para atingir os limites de taxa de transferência de VM de 32 vCPU. Para obter mais informações, consulte Desempenho do armazenamento em blocos .

  1. Crie e inicie uma instância de VM .

  2. Adicione um disco permanente à instância de VM que você pretende avaliar.

  3. Conecte-se à sua instância .

  4. Instale dependências:

    sudo apt-get update
    sudo apt-get install -y fio
    
  5. Preencha o disco com dados diferentes de zero. As leituras de disco permanente de blocos vazios têm um perfil de latência diferente dos blocos que contêm dados. Recomendamos preencher o disco antes de executar qualquer benchmark 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 executando gravações sequenciais com vários fluxos paralelos (16+), usando 1 MB como tamanho de E/S e tendo uma profundidade de E/S maior ou igual 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. Teste a gravação de IOPS. Para atingir o máximo de IOPS de PD, você deve manter uma fila de E/S profunda. Se, por exemplo, a latência de gravação for de 1 milissegundo, a VM poderá atingir, no máximo, 1.000 IOPS para cada E/S em andamento. Para atingir 15.000 IOPS de gravação, a VM deve manter pelo menos 15 E/S em andamento. Se o disco e a VM conseguirem atingir 30.000 IOPS de gravação, o número de E/S em andamento deverá ser de pelo menos 30 E/S. Se o tamanho de E/S for maior que 4 KB, a VM poderá 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 gravação. Ao testar a latência de E/S, a VM não deve atingir a largura de banda máxima ou IOPS; caso contrário, a latência observada não refletirá a latência real de E/S do disco persistente. Por exemplo, se o limite de IOPS for atingido em uma profundidade de E/S de 30 e o comando fio tiver o dobro disso, o IOPS total permanecerá o mesmo 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=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 realizando leituras sequenciais com vários fluxos paralelos (16+), usando 1 MB como tamanho de E/S e tendo uma profundidade de E/S igual a 64 ou superior.

    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 a leitura de IOPS. Para atingir o PD IOPS máximo, você deve manter uma fila de E/S profunda. Se, por exemplo, o tamanho de E/S for maior que 4 KB, a VM poderá atingir o limite de largura de banda antes de atingir o limite de IOPS. Para atingir 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 ou de taxa de transferência durante esse teste porque, após o disco permanente atingir seu limite de saturação, ele retrocede nas E/S de entrada e isso se reflete 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=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 gravação 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 permanente e a VM descartáveis:

    1. Exclua o disco usado para avaliação de desempenho.
    2. Exclua a VM criada para avaliação de desempenho.

O que vem a seguir