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.
Instale dependências:
sudo apt update sudo apt install -y fio
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
.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
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
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
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
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
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 .
Adicione um disco permanente à instância de VM que você pretende avaliar.
Instale dependências:
sudo apt-get update sudo apt-get install -y fio
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
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
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
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
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
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
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
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 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
Limpe o disco permanente e a VM descartáveis:
- Exclua o disco usado para avaliação de desempenho.
- Exclua a VM criada para avaliação de desempenho.
O que vem a seguir
- Aprenda como monitorar o desempenho do disco analisando as métricas de desempenho do disco .
- Saiba mais sobre os preços do disco permanente .
- Saiba como otimizar o desempenho do disco permanente .