Linux Diskdatei AIO

8

Laut dieser Anleitung kann die asynchrone Datei io leicht mit AIO unter Linux erstellt werden zumindest aus Sicht der Programmierung / API. Aber vor und nach diesem Tutorial hatte ich eine Menge Posts und Artikel gelesen, dass dies entweder nicht möglich ist oder Sie sollten libevent mit einem Patch und vielen anderen Problemen verwenden. Eine andere Sache war die Schleife, auf die ich auf ein Signal hätte warten sollen, aber basierend auf diesem Tutorial kann ich einen Callback-Mechanismus verwenden, der AIO offensichtlich viel einfacher zu benutzen macht.

Nun, ich bin kein Linux-Programmierer, auch wenn ich schon lange wollte, ich wollte einfach einen einfachen Weg finden, asynchrone Datei auf Linux zu unterstützen, lerne sie und füge sie zu einer Async-Diskio-Bibliothek hinzu, die ich für ein persönliches brauche Projekt. Zur Zeit verwende ich überlappende io-Fenster und io-Worker-Threads auf Nicht-Windows-Plattformen. Da die Lösung mit mehreren Threads knifflig sein kann, wollte ich sie auf Linux durch AIO ersetzen.

SO, was ist falsch an AIO, wie in diesem Tutorial beschrieben? Ist es Leistung? Gibt es eine Einschränkung für Operationen, die mit AIO durchgeführt werden können?

ps. Es ist mir egal, ob der Code nicht auf andere POSIX-kompatible Plattformen portierbar ist, solange er auf Major-Linux-Distributionen funktioniert. Und alles, was mir wichtig ist, ist die normale Festplattendatei.

Danke.

    
p00ya00 15.12.2011, 00:30
quelle

2 Antworten

11

Das Tutorial gibt einen Überblick über asynchrone I / O im Allgemeinen und spricht darüber, wie es Kernel-Unterstützung dafür gibt. Dann geht es weiter über posix AIO (das ist die standardisierte API für den Zugriff auf asynchrone E / A), was bedeutet, dass Sie mit der POSIX AIO API unter Linux Zugriff auf die Kernel-Unterstützung für AIO erhalten. Dies ist nicht der Fall.

Unter Linux gibt es wirklich zwei separate AIO-Implementierungen:

  1. kernel AIO, das io_submit () et al.) verwendet, das nur in Kernel 2.6 (oder wirklich 2.5 unterstützt wird und es möglicherweise Back-Ported-Versionen davon zu 2.4.
  2. gibt
  3. posix AIO, eine Glibc-Funktion, die im Wesentlichen nicht mit dem Kernel zusammenhängt. Es implementiert die POSIX-API in Bezug auf Threads auf Benutzerebene, die das Blockieren von Festplatten-I / O-Aufrufen ermöglichen.

Kurz gesagt, wenn Sie bereits eine generische Implementierung von mehreren Threads für Disk-I / O haben, sollten Sie besser die glibc-Implementierung verwenden (weil Sie vielleicht etwas mehr Kontrolle darüber haben). p>

Wenn Sie sich verpflichtet haben, die io_submit () - Funktionsfamilie zu verwenden, müssen Sie möglicherweise eine Menge Arbeit aufwenden, um die Einschränkungen für diese Funktionen zu umgehen.

Kernel AIO erfordert , dass Ihre Dateien mit O_DIRECT geöffnet werden. Das wiederum erfordert, dass alle Dateioffsets, Lese- und Schreibgrößen an Blöcken auf der Festplatte ausgerichtet werden. Dies ist in der Regel in Ordnung, wenn Sie nur eine große Datei verwenden und sie so funktionieren lassen, dass sie dem Seitencache im Betriebssystem sehr ähnlich ist. Zum Lesen und Schreiben beliebiger Dateien mit beliebigen Offsets und Längen wird es unordentlich.

Wenn Sie Kernel AIO eine Chance geben, würde ich Ihnen wärmstens empfehlen, ein oder mehrere Eventfds an Ihre Iocbs zu binden, damit Sie auf die Fertigstellung mit epoll / select warten können und nicht in io_getevents () blockieren müssen.

    
Arvid 19.12.2011, 04:53
quelle
2

Die Linux-Implementierung von POSIX AIO erzeugt für jeden von Ihnen ausgeführten Schreibvorgang einen Thread. Dies ist normalerweise nicht gut und Sie verwenden besser Ihre eigenen Worker-Threads, um die Schreibvorgänge auszuführen, sodass Sie steuern können, wie viele Threads im Spiel sind. Mit anderen Worten, bleibe bei dem was du hast, AIO wird dir nichts kaufen.

    
John Zwinck 15.12.2011 02:01
quelle

Tags und Links