Warum dauert es so lange, bis `hdparm -t` auf meiner EC2-Instance genaue Ergebnisse liefert?

Warum dauert es so lange, bis `hdparm -t` auf meiner EC2-Instance genaue Ergebnisse liefert?

Ich erstelle ein Profil eines Datenverarbeitungsprogramms, das ich geschrieben habe, und möchte den theoretischen Durchsatz der Maschine verstehen, an der ich arbeite. Insbesondere möchte ich messen, welche Festplattenlesegeschwindigkeit meine g4dn EC2-Instanz meiner Anwendung bietet. Diese spezielle Instanz verfügt über ein temporäres NVMe-Laufwerk, das ich als Benchmark verwenden möchte.

Mir fällt auf, dass es einige Durchläufe braucht, hdparmbis der gemeldete Durchsatz nicht mehr ansteigt. Meine Frage ist, warum hdparmmehrere Durchläufe nötig sind, um den vollen Lesedurchsatz zu erreichen? Was ist es im Linux-Kernel/Festplattentreiber/Laufwerkscontroller/der eigentlichen Hardware, das mehrere Durchläufe erfordert, hdparmum genaue Ergebnisse zu erzielen?

Ich weiß, dass in den Manpages steht, dass man es ein paar Mal ausführen soll, aber meiner Erfahrung nach dauert es viel öfter als die empfohlenen drei Mal, bis der maximale Durchsatz erreicht ist.

-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.

Um die Lesegeschwindigkeit zu erfassen, führe ich Folgendes aus:

#!/usr/bin/env bash
while true; do
   sudo hdparm -t /dev/nvme0n1p1;
   sleep 1;
done

und erhalten Sie die folgende Ausgabe:

$ 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

Es dauert vielleicht 20 Durchläufe, bis es sich bei etwa 330 MB/s einpendelt.

Beachten Sie, dass ich ein AMI verwende, das über die richtigen NVMe-Treiber verfügt.

Antwort1

Es stellt sich heraus, dass die lokalen NVMe-Laufwerke, die standardmäßig auf einigen EC2-Instanzen verfügbar sind, nicht einsatzbereit sind und das „einsatzbereite“ NVMe-Gerät tatsächlich ein als NVMe-Laufwerk gemountetes EBS-Volume ist. Dies erklärt den niedrigen Durchsatz (300 MB/s) und die langsame Aufwärmzeit (20 Durchläufe).

Zur Information: Ich habe beim ersten Durchlauf eine sequentielle Lesegeschwindigkeit von 1,7 GB/s erreicht, nachdem hdparmich meinrealNVMe-Laufwerke. Sie sind ab sichtbar lsblk.

verwandte Informationen