Warum ist mein NVMe langsamer als eine SSD?

Warum ist mein NVMe langsamer als eine SSD?
In diesem Artikel werden wir einige Nuancen des I/O-Subsystems und deren Auswirkungen auf die Leistung betrachten.

Vor ein paar Wochen stieß ich auf die Frage, warum NVMe auf einem Server langsamer ist als SATA auf einem anderen. Ich habe mir die Eigenschaften der Server angesehen und festgestellt, dass es sich um eine Fangfrage handelte: NVMe stammte aus dem Benutzersegment und SSD aus dem Serversegment.

Natürlich ist es nicht korrekt, Produkte aus verschiedenen Segmenten in unterschiedlichen Umgebungen zu vergleichen, aber dies ist keine erschöpfende technische Antwort. Wir werden die Grundlagen erlernen, Experimente durchführen und eine Antwort auf die gestellte Frage geben.

Was ist fsync und wo wird es verwendet?

Um die Arbeit mit Laufwerken zu beschleunigen, werden Daten gepuffert, also im flüchtigen Speicher gespeichert, bis sich eine günstige Gelegenheit bietet, den Inhalt des Puffers auf dem Laufwerk zu speichern. Die Chancenkriterien werden durch das Betriebssystem und die Laufwerkseigenschaften bestimmt. Bei einem Stromausfall gehen alle Daten im Puffer verloren.

Bei einer Reihe von Aufgaben müssen Sie sicherstellen, dass die Änderungen in der Datei auf das Laufwerk geschrieben werden und nicht in einem Zwischenpuffer liegen. Diese Sicherheit kann durch Verwendung des POSIX-kompatiblen fsync-Systemaufrufs erreicht werden. Der fsync-Aufruf erzwingt einen Schreibvorgang vom Puffer auf das Laufwerk.

Lassen Sie uns die Wirkung von Puffern anhand eines künstlichen Beispiels in Form eines kurzen C-Programms demonstrieren.

#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>

int main(void) {
    /* Открываем файл answer.txt на запись, если его нет -- создаём */
    int fd = open("answer.txt", O_WRONLY | O_CREAT);
    /* Записываем первый набор данных */
    write(fd, "Answer to the Ultimate Question of Life, The Universe, and Everything: ", 71);
    /* Делаем вид, что проводим вычисления в течение 10 секунд */
    sleep(10);
    /* Записываем результат вычислений */
    write(fd, "42n", 3); 

    return 0;
}

Kommentare erläutern die Abfolge der Aktionen im Programm gut. Der Text „Die Antwort auf die Hauptfrage des Lebens, des Universums und all dem“ wird vom Betriebssystem zwischengespeichert, und wenn Sie den Server durch Drücken der Reset-Taste während „Berechnungen“ neu starten, ist die Datei leer. In unserem Beispiel stellt Textverlust kein Problem dar, daher ist fsync nicht erforderlich. Datenbanken teilen diesen Optimismus nicht.

Datenbanken sind komplexe Programme, die mit vielen Dateien gleichzeitig arbeiten. Daher möchten sie sicher sein, dass die von ihnen geschriebenen Daten auf dem Laufwerk gespeichert werden, da die Konsistenz der Daten innerhalb der Datenbank davon abhängt. Die Datenbanken sind so konzipiert, dass sie alle abgeschlossenen Transaktionen aufzeichnen und jederzeit für einen Stromausfall bereit sind. Dieses Verhalten zwingt Sie dazu, fsync ständig in großen Mengen zu verwenden.

Was beeinflusst die häufige Verwendung von fsync

Bei normaler E/A versucht das Betriebssystem, die Festplattenkommunikation zu optimieren, da externe Laufwerke in der Speicherhierarchie die langsamsten sind. Daher versucht das Betriebssystem, bei einem Zugriff auf das Laufwerk so viele Daten wie möglich zu schreiben.

Lassen Sie uns die Auswirkungen der Verwendung von fsync anhand eines konkreten Beispiels demonstrieren. Als Testpersonen haben wir folgende SSDs im Einsatz:

  • Intel® DC SSD S4500 480 GB, Anbindung über SATA 3.2, 6 Gbit/s;
  • Samsung 970 EVO Plus 500 GB, verbunden über PCIe 3.0 x4, ~31 Gbit/s.

Die Tests werden auf einem Intel® Xeon® W-2255 mit Ubuntu 20.04 durchgeführt. Zum Testen von Festplatten wird Sysbench 1.0.18 verwendet. Die Festplatten verfügen über eine einzelne Partition, die als ext4 formatiert ist. Zur Vorbereitung auf den Test müssen 100-GB-Dateien erstellt werden:

sysbench --test=fileio --file-total-size=100G prepare

Laufende Tests:

# Без fsync
sysbench --num-threads=16 --test=fileio --file-test-mode=rndrw --file-fsync-freq=0 run

# С fsync после каждой записи
sysbench --num-threads=16 --test=fileio --file-test-mode=rndrw --file-fsync-freq=1 run

Die Testergebnisse sind in der Tabelle dargestellt.

Test
Intel® S4500
Samsung 970 EVO+

Lesen ohne fsync, MiB/s
5734.89
9028.86

Schreiben ohne fsync, MiB/s
3823.26
6019.24

Lesen mit fsync, MiB/s
37.76
3.27

Aufnahme mit fsync, MiB/s
25.17
2.18

Es ist leicht zu erkennen, dass NVMe aus dem Client-Segment souverän führt, wenn das Betriebssystem selbst entscheidet, wie mit Festplatten gearbeitet wird, und verliert, wenn fsync verwendet wird. Dies wirft zwei Fragen auf:

  1. Warum übersteigt die Lesegeschwindigkeit im Test ohne fsync die physikalische Bandbreite des Links?
  2. Warum kann eine Serversegment-SSD eine große Anzahl von Fsync-Anfragen besser verarbeiten?

Die Antwort auf die erste Frage ist einfach: Sysbench generiert mit Nullen gefüllte Dateien. Somit wurde der Test über 100 Gigabyte an Nullen durchgeführt. Da die Daten sehr einheitlich und vorhersehbar sind, kommen verschiedene Betriebssystemoptimierungen ins Spiel, die die Ausführung deutlich beschleunigen.

Wenn Sie alle Ergebnisse von Sysbench in Frage stellen, können Sie FIO verwenden.

# Без fsync
fio --name=test1 --blocksize=16k --rw=randrw --iodepth=16 --runtime=60 --rwmixread=60 --fsync=0 --filename=/dev/sdb

# С fsync после каждой записи
fio --name=test1 --blocksize=16k --rw=randrw --iodepth=16 --runtime=60 --rwmixread=60 --fsync=1 --filename=/dev/sdb

Test
Intel® S4500
Samsung 970 EVO+

Lesen ohne fsync, MiB/s
45.5
178

Schreiben ohne fsync, MiB/s
30.4
119

Lesen mit fsync, MiB/s
32.6
20.9

Aufnahme mit fsync, MiB/s
21.7
13.9

Der Trend zum Leistungsabfall bei NVMe bei Verwendung von fsync ist deutlich erkennbar. Sie können mit der zweiten Frage fortfahren.

Optimierung oder Bluff

Zuvor haben wir gesagt, dass die Daten in einem Puffer gespeichert werden, haben aber nicht angegeben, in welchem ​​Puffer, da dies nicht wichtig ist. Auch jetzt werden wir uns nicht mit den Feinheiten von Betriebssystemen befassen und zwei allgemeine Arten von Puffern herausgreifen:

  • Programm;
  • Hardware.

Der Softwarepuffer bezieht sich auf die Puffer im Betriebssystem, und der Hardwarepuffer bezieht sich auf den flüchtigen Speicher des Festplattencontrollers. Der fsync-Systemaufruf sendet einen Befehl an das Laufwerk, um Daten aus seinem Puffer in den Hauptspeicher zu schreiben, hat jedoch keine Möglichkeit, die korrekte Ausführung des Befehls zu steuern.

Da die SSD eine bessere Leistung erbringt, können zwei Annahmen getroffen werden:

  • die Festplatte ist für eine Belastung ähnlicher Bauart ausgelegt;
  • Die Festplatte „blufft“ und ignoriert den Befehl.

Unehrliches Verhalten des Laufwerks kann auffallen, wenn Sie einen Test bei Stromausfall durchführen. Sie können dies mit einem Skript überprüfen. diskchecker.pl, который был erstellt in 2005 Jahr.

Dieses Skript erfordert zwei physische Maschinen – „Server“ und „Client“. Der Client schreibt eine kleine Datenmenge auf das zu testende Laufwerk, ruft fsync auf und sendet dem Server Informationen darüber, was geschrieben wurde.

# Запускается на сервере
./diskchecker.pl -l [port]

# Запускается на клиенте
./diskchecker.pl -s <server[:port]> create <file> <size_in_MB>

Nach dem Ausführen des Skripts ist es notwendig, den „Client“ stromlos zu machen und die Stromversorgung für einige Minuten nicht wiederherzustellen. Es ist wichtig, die Testperson vom Strom zu trennen und nicht nur einen harten Shutdown durchzuführen. Nach einiger Zeit kann der Server angeschlossen und in das Betriebssystem geladen werden. Nach dem Booten des Betriebssystems müssen Sie erneut starten diskchecker.pl, aber mit einem Argument überprüfen.

./diskchecker.pl -s <server[:port]> verify <file>

Am Ende der Prüfung sehen Sie die Anzahl der Fehler. Wenn sie 0 sind, hat die Festplatte den Test bestanden. Um eine für die Scheibe erfolgreiche Kombination von Umständen auszuschließen, kann das Experiment mehrmals wiederholt werden.

Unser S4500 zeigte keine Stromausfallfehler, was bedeutet, dass er für Lasten mit vielen Fsync-Aufrufen bereit ist.

Abschluss

Bei der Auswahl von Festplatten oder ganzen vorgefertigten Konfigurationen sollten Sie die Besonderheiten der zu lösenden Aufgaben berücksichtigen. Auf den ersten Blick scheint es offensichtlich, dass NVMe, also eine SSD mit PCIe-Schnittstelle, schneller ist als eine „klassische“ SATA-SSD. Wie wir jedoch heute verstanden haben, ist dies unter bestimmten Bedingungen und bei bestimmten Aufgaben möglicherweise nicht der Fall.

Wie testet man Serverkomponenten, wenn man sie bei einem IaaS-Anbieter mietet?
Wir erwarten Sie in den Kommentaren.

Warum ist mein NVMe langsamer als eine SSD?

Source: habr.com

Kommentar hinzufügen