Por que `hdparm -t` demora tanto para produzir resultados precisos na minha instância EC2?

Por que `hdparm -t` demora tanto para produzir resultados precisos na minha instância EC2?

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 hdparmaté que a taxa de transferência relatada pare de aumentar. Minha pergunta é: por que são hdparmnecessá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 hdparmpara 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, hdparmquando formatei e montei meurealunidades nvme. Eles ficarão visíveis a partir de lsblk.

informação relacionada