Unix/Linux - Concurrent I/O Read-ahead



  • Hallo Kollegen,
    ich stehe vor einem kleine/mittelgroßen Problem, nachdem ich jetzt schon etwas gegoogled habe... aber noch keine passende Library bzw. Stück Coding gefunden habe... es geht um folgendes...

    Mein Programm macht bzw. besteht aus folgendem:

    1. Server der auf Anfrage, Daten (ca. 2GB Files) an einem Client streamed
    2. Der Client empfängt die Daten, simuliert mit den Daten etwas und gibt dann dementsprechend etwas am Client aus

    Das ganze Konzept funktioniert auch sehr gut, außer wenn der Kunde das Filesystem (auf dem das 2GB File liegt) am Server mit der Option "cio" mountet. Da bei Concurrent I/O der Read-ahead des Betriebssystems (Filesystem Cache) wegfällt, wird das Lesen und Versenden der Daten extrem langsam.

    Der Kunde hat Linux (RedHat) und AIX (5L) im Einsatz.
    Ich kann das Verhalten ebenso bei mir hier nachstellen. Mit dem Native Kommando "cp" erreiche dann eben auch diese schlechte Performance beim Kopieren von Files die auf einem Filesystem liegen das mit "cio" gemounted ist...

    Nun gibt es ja auch Anwendungen die trotz der Option "cio", die Daten performant und evtl. sogar noch schneller lesen können.. als Beispiele möchte ich hier mal Oracle oder verschiedene Backuputilities (TSM Client) nennen.

    Die Anwendungen machen den Read-ahead selbst und erreichen so die Performance...

    Meine Frage nun an Euch:
    Gibt es hierfür schon fertige Funktionen oder Libraries die ich einbinden kann und dann der Mountoption dementsprechend ein anderes Read-Kommando aufrufe?

    Ich habe nämlich erhlich gesagt keinen blassen Schimmer wie ich den Read-ahead selbst programmieren soll...

    Wäre super wenn da jemand ein paar Tipps hätte...

    EDIT:
    Habe jetzt etwas über "memory aligned buffer" gelesen... aber immernoch kein Beispielcoding wie sowas implementiert ist und mit dem fopen() genutzt werden kann.

    Gruß



  • Wenn ich
    http://www-03.ibm.com/servers/aix/whitepapers/db_perf_aix.pdf
    lese, denke ich, dass Anwendungen, die nur Lesen keine Vorteile erhalten.



  • Ponto schrieb:

    Wenn ich
    http://www-03.ibm.com/servers/aix/whitepapers/db_perf_aix.pdf
    lese, denke ich, dass Anwendungen, die nur Lesen keine Vorteile erhalten.

    Das ist korrekt... der Kunde willl kein I-Node Locking, da in dem Filesystem noch andere Anwendungen liegen, und diese greifen parallel auf die Files zu (auch schreibend).

    Jetzt soll bzw. muss unsere Anwendung Concurrent I/O supporten und dazu muss ich eben irgendwie den Read-ahead selbst machen (mittles memory aligned buffer).

    Ich habe jetzt schon was in dieser Richtung in der man page zum open() gefunden.
    http://www.die.net/doc/linux/man/man2/open.2.html

    Die Option O_DIRECT ist dann Direct I/O (sowas wie CIO nur mit I-Node Locking)... dort gibt es auch keine Buffer und die Anwendung muss den Read-ahead durchführen. Hier steht auch das es die Performance verschlechtern wird, und die Awendung den Buffer erzeugen muss.. aber leider wieder keine Erklärung wie bzw. mit welcher Funktion... 😡

    Ich hoffe immernoch auf euch!





  • rüdiger schrieb:

    libaio

    http://oss.oracle.com/projects/libaio-oracle/
    http://lse.sourceforge.net/io/aio.html

    Hallo Rüdiger,
    vielen Dank für die Links... ich habe aber so meine Verständnisprobleme damit.

    1. Würde das ganze ja nur unter Linux funktionieren... ich brauch es aber auch unter AIX

    2. Habe ich richtig verstanden, das ich die Daten asynchron lesen und schreiben kann obwohl der Systembuffer mit der mountoption cio deaktiviert ist? Übernimmt dann die libaio für mich den Read-ahead bzw. die Bufferung?

    Wäre super 🙂

    Danke!



  • Die API ist AFAIK von POSIX spezifiziert. Also solltest du vermutlich auch so was unter AIX finden. Aber ich hab selbst damit noch nicht gearbeitet.


Anmelden zum Antworten