2015-03-12 6 views
15

Ich schreibe ein C-Programm zum Lesen von Daten von einem SSD-Laufwerk durch direkt aus der Rohblock-Gerätedatei lesen.Wie behandelt der Linux-Kernel Asynchronous I/O (AIO) -Anfragen?

Ich versuche die Linux AIO (ich spreche über die Linux AIO API, d. H. Die Funktionen von linuxaio.h, wie io_submit(...) usw., nicht die POSIX AIO API). Ich öffne die Block-Gerätedatei mit dem O_DIRECT Flag und ich stelle sicher, dass ich schreibe, um Puffer auf Blockgröße ausgerichtet sind.

Ich bemerkte, dass Linux AIO es wesentlich schneller ist als die Verwendung von syncronous IO auch mit O_DIRECT Flag. Die Sache, die mich am meisten überraschte, ist, dass der Durchsatz, der durch die Ausgabe vieler kleiner zufälliger Lesevorgänge von wenigen KBs mit jeweils Linux AIO erreicht wird, deutlich höher ist, als der Durchsatz beim sequenziellen Lesen von wenigen MBs mit synchronem I/O und O_DIRECT.

Also würde ich gerne wissen: Wie macht Linux AIO das besser als synchrone I/O? Was macht der Kernel, wenn AIO verwendet wird? Führt der Kernel eine Neuordnung der Anfrage durch? Führt die Verwendung von Linux AIO zu einer höheren CPU-Auslastung als die Verwendung von synchroner E/A?

Vielen Dank im Voraus

+0

AIO ist schneller, weil sein Name. seine asynchrone, im Grunde genommen alles IO wird zum Speicher und nicht zu zugrundeliegenden Platten getan. –

+4

@Miline: Das macht überhaupt keinen Sinn. Ein zufälliges Lesen von der Festplatte erfordert unbedingt physische I/O von der Festplatte. Es gibt keine Möglichkeit, diese Bytes von der Festplatte in den Speicher zu übertragen. – MSalters

+0

Was ich meinte war, dass die IO meistens aus dem Speicher gemacht wird, wo die Daten zwischengespeichert werden. Die zu schreibenden Daten werden in den Speicher geladen und dann wird das io zur Anwendung zurückgeführt. Und diese Seite im Speicher ist als schmutzig markiert. Also der Auftrag seines Dateisystems, diese Seite auf die Festplatte zu schreiben ... im Falle von DIRECTIO .. io wird erst zurückgegeben, wenn die Daten auf die Platte geschrieben wurden –

Antwort

20

Kurze Antwort: Höchstwahrscheinlich wird die AIO-Implementierung ist „schneller“, da sie mehrere IOs parallel vorträgt, während die synchrone Implementierung entweder Null oder ein I/O im Flug hat . Es hat nichts mit dem Schreiben in den Speicher oder mit dem Kernel-E/A-Pfad zu tun, der zusätzlichen Overhead für synchrone E/A hat.

Sie können dies überprüfen mit iostat -x-d 1. Sehen Sie sich die avgqu-sz an (durchschnittliche Warteschlangengröße = die durchschnittliche Anzahl der E/A während des Betriebs) und % util (Auslastung = Prozentsatz der Zeit, für die dem Gerät mindestens eine E/A zugewiesen wurde) .

Lange Antwort:

  • Das Konzept der "schneller" heikel ist, wenn man über I/O. Bedeutet "schneller" höhere Bandbreite? Oder ist es niedrigere Latenz? Oder Bandbreite bei einer bestimmten Anfrage Größe? Oder Latenz bei einer bestimmten Warteschlangentiefe? Oder eine Kombination aus Latenz, Bandbreite, Anforderungsgröße, Warteschlangentiefe und den vielen anderen Parametern oder der Arbeitslast? Ich gehe hier davon aus, dass Sie über Durchsatz/Bandbreite verfügen, es ist jedoch gut zu wissen, dass die Leistung eines Speichergeräts keine einzelne Dimensionsmetrik ist.

  • SSDs sind hochparallele Geräte. Eine SSD besteht aus vielen Flash-Chips, wobei jeder Chip mehrere Chips aufweist, die unabhängig voneinander lesen und schreiben können. SSDs nutzen dies und führen parallel viele I/Os durch, ohne dass sich die Reaktionszeit merklich erhöht. In Bezug auf den Durchsatz spielt es daher eine Rolle, wie viele gleichzeitige I/Os die SSD sieht.

  • Lässt verstehen, was passiert, wenn ein Thread eine synchrone E/A übermittelt: a) der Thread gibt einige CPU-Zyklen aus, um die E/A-Anforderung vorzubereiten (Daten generieren, Offset berechnen, Daten in Puffer kopieren usw.), b) Der Systemaufruf wird ausgeführt (z. B. pread()), die Ausführung wird an den Kernelraum übergeben und die Threadblöcke, c) die E/A-Anforderung wird vom Kernel verarbeitet & durchläuft die verschiedenen Kernel-E/A-Schichten, d) das I/O-Anforderung wird an das Gerät gesendet und durchläuft die Verbindung (z. B.PCIe), e) die E/A-Anforderung wird von der SSD-Firmware bearbeitet, f) der eigentliche Lesebefehl wird an den entsprechenden Flash-Chip gesendet, g) der SSD-Controller wartet auf die Daten, h) der SSD-Controller holt die Daten ab der Flash-Chip und sendet es durch die Verbindung. An diesem Punkt verlassen die Daten die SSD und die Stufen e-a) geschehen in umgekehrter Reihenfolge.

  • Wie Sie sehen können, wird der synchrone I/O-Prozess die Ping-Pong-Abfrage mit der SSD abspielen. Während vieler der oben beschriebenen Stufen werden tatsächlich keine Daten von den Flash-Chips gelesen. Obendrein kann Ihre SSD zwar Dutzende bis Hunderte von Anfragen parallel verarbeiten, sieht aber zu jedem Zeitpunkt höchstens eine Anfrage. Daher ist der Durchsatz sehr, sehr gering, da Sie die SSD nicht wirklich nutzen.

  • Asynchronous I/O hilft auf zwei Arten: a) Es erlaubt dem Prozess, mehrere E/A-Anforderungen parallel zu übermitteln (die SSD hat genug Arbeit, um beschäftigt zu bleiben), und b) es erlaubt Pipelining I/O durch die verschiedenen Verarbeitungsstufen (daher Entkopplungsstufenlatenz vom Durchsatz).

  • Der Grund, warum asynchrones E/A schneller als synchrones E/A ist, liegt daran, dass Sie Äpfel und Orangen vergleichen. Der synchrone Durchsatz liegt bei einer gegebenen Anforderungsgröße, einer niedrigen Warteschlangentiefe und ohne Pipelining. Der asynchrone Durchsatz hat eine andere Anforderungsgröße, höhere Warteschlangentiefe und Pipelining. Die Zahlen, die Sie gesehen haben, sind nicht vergleichbar.

  • Die Mehrzahl der E/A-intensiven Anwendungen (d. H. Die meisten Anwendungen wie Datenbanken, Webserver usw.) haben viele Threads, die synchrone E/A durchführen. Obwohl jeder Thread zu jedem gegebenen Zeitpunkt höchstens eine E/A senden kann, sieht der Kernel & das SSD-Gerät viele E/A-Anforderungen, die parallel bedient werden können. Mehrere E/A-Synchronisierungsanforderungen führen zu denselben Vorteilen wie mehrere asynchrone E/A-Anforderungen.

    Die Hauptunterschiede zwischen asynchroner und synchroner E/A hängen davon ab, wie die E/A & die Planung und das Programmiermodell verarbeitet. Beide asynchrone & Sync-I/O können denselben IOPS/Durchsatz von einem Speichergerät komprimieren, wenn dies richtig ausgeführt wird.