¿Por qué `hdparm -t` tarda tanto en producir resultados precisos en mi instancia EC2?

¿Por qué `hdparm -t` tarda tanto en producir resultados precisos en mi instancia EC2?

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 hdparmhasta que el rendimiento que informa deja de aumentar. Mi pregunta es, ¿por qué se hdparmnecesitan 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 hdparmpara 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 hdparmcuando formateé y monté mirealunidades nvme. Serán visibles desde lsblk.

información relacionada