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
AIO ist schneller, weil sein Name. seine asynchrone, im Grunde genommen alles IO wird zum Speicher und nicht zu zugrundeliegenden Platten getan. –
@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
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 –