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.
Instalar dependências:
sudo apt update sudo apt install -y fio
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
.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
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
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
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
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
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.
Adicione um disco persistente à instância de VM que pretende testar.
Instalar dependências:
sudo apt-get update sudo apt-get install -y fio
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
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
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
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
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
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
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
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
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
Limpe o disco persistente e a VM descartáveis:
- Elimine o disco usado para testar o desempenho.
- Elimine a VM criada para testes de referência de desempenho.
O que se segue?
- Saiba como monitorizar o desempenho do disco revendo as métricas de desempenho do disco.
- Saiba mais sobre os preços dos discos persistentes.
- Saiba como otimizar o desempenho do disco persistente.