Estou traçando o perfil de um programa de processamento de dados que escrevi e quero entender o rendimento teórico da máquina em que estou. Especificamente, quero medir a velocidade de leitura de disco que minha instância g4dn EC2 está fornecendo ao meu aplicativo. Esta instância específica possui uma unidade NVMe efêmera, que é o que desejo avaliar.
Percebo que são necessárias algumas execuções hdparm
até que a taxa de transferência relatada pare de aumentar. Minha pergunta é: por que são hdparm
necessárias várias execuções para obter o rendimento total da leitura? O que há no kernel / driver de disco / controlador de unidade / hardware real do Linux que requer várias execuções hdparm
para obter resultados precisos?
Eu sei que as páginas de manual dizem para executá-lo algumas vezes, mas na minha experiência leva muito mais do que as três vezes recomendadas para que o rendimento atinja o máximo.
-t Perform timings of device reads for benchmark and
comparison purposes. For meaningful results, this
operation should be repeated 2-3 times on an otherwise
inactive system (no other active processes) with at least
a couple of megabytes of free memory. This displays the
speed of reading through the buffer cache to the disk
without any prior caching of data. This measurement is an
indication of how fast the drive can sustain sequential
data reads under Linux, without any filesystem overhead.
To ensure accurate measurements, the buffer cache is
flushed during the processing of -t using the BLKFLSBUF
ioctl.
Eu executo o seguinte para coletar a velocidade de leitura:
#!/usr/bin/env bash
while true; do
sudo hdparm -t /dev/nvme0n1p1;
sleep 1;
done
e obtenha a seguinte saída:
$ while true; do sudo hdparm -t /dev/nvme0n1p1; sleep 1; done
/dev/nvme0n1p1:
Timing buffered disk reads: 470 MB in 3.09 seconds = 152.30 MB/sec
/dev/nvme0n1p1:
Timing buffered disk reads: 490 MB in 3.10 seconds = 158.21 MB/sec
/dev/nvme0n1p1:
Timing buffered disk reads: 526 MB in 3.02 seconds = 174.43 MB/sec
São necessárias talvez 20 execuções antes de atingir cerca de 330 MB/s.
Observe que estou usando uma AMI que possui os drivers NVMe corretos.
Responder1
Acontece que as unidades nvme locais disponíveis em algumas instâncias do EC2 por padrão não estão prontas para uso, e o dispositivo nvme "pronto para uso" é na verdade um volume EBS montado como uma unidade nvme. Isso explica o baixo rendimento (300 MB/s) e o tempo de aquecimento lento (20 execuções).
Para referência futura, obtive velocidades de leitura sequencial de 1,7 GB/s desde a primeira execução, hdparm
quando formatei e montei meurealunidades nvme. Eles ficarão visíveis a partir de lsblk
.