Estoy perfilando un programa de procesamiento de datos que escribí y quiero entender el rendimiento teórico de la máquina en la que estoy. Específicamente, quiero medir qué velocidad de lectura de disco proporciona mi instancia g4dn EC2 a mi aplicación. Esta instancia en particular tiene una unidad NVMe efímera, que es lo que quiero comparar.
Noto que se necesitan bastantes ejecuciones hdparm
hasta que el rendimiento que informa deja de aumentar. Mi pregunta es, ¿por qué se hdparm
necesitan varias ejecuciones para obtener un rendimiento de lectura completo? ¿Qué hay en el kernel de Linux/controlador de disco/controlador de unidad/hardware real que requiere múltiples ejecuciones hdparm
para obtener resultados precisos?
Sé que las páginas de manual dicen que se ejecute varias veces, pero en mi experiencia se necesitan mucho más que las 3 veces recomendadas para que el rendimiento alcance el 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.
Ejecuto lo siguiente para recopilar la velocidad de lectura:
#!/usr/bin/env bash
while true; do
sudo hdparm -t /dev/nvme0n1p1;
sleep 1;
done
y obtenga el siguiente resultado:
$ 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
Se necesitan unas 20 ejecuciones antes de que se estabilice alrededor de 330 MB/seg.
Tenga en cuenta que estoy usando una AMI que tiene los controladores NVMe correctos.
Respuesta1
Resulta que las unidades nvme locales disponibles en algunas instancias EC2 de forma predeterminada no están listas para su uso, y el dispositivo nvme "listo para usar" es en realidad un volumen EBS montado como una unidad nvme. Esto explica el bajo rendimiento (300 MB/s) y el lento tiempo de calentamiento (20 ejecuciones).
Para referencia futura, obtuve velocidades de lectura secuencial de 1,7 GB/s desde la primera ejecución hdparm
cuando formateé y monté mirealunidades nvme. Serán visibles desde lsblk
.