Ab wann ist das asynchrone Lesen von Festplatten-E / A effizienter als das synchrone?


22

Angenommen, es gibt ein bisschen Code, der Dateien für mehrere Konsumenten liest, und die Dateien haben eine beliebige Größe: Ab welcher Größe wird es effizienter, die Datei asynchron zu lesen? Oder anders ausgedrückt: Wie klein muss eine Datei sein, damit sie schneller ist, nur um sie synchron zu lesen?

Mir ist aufgefallen (und ich bin vielleicht falsch), dass das asynchrone Lesen sehr kleiner Dateien länger dauert als das synchrone (insbesondere bei .NET). Ich gehe davon aus, dass dies mit der Einrichtungszeit für Dinge wie E / A-Abschlussports, Threads usw. zu tun hat.

Gibt es eine Faustregel, um hier zu helfen? Oder ist es abhängig vom System und der Umgebung?


Können Sie den Code angeben, den Sie als Benchmark verwenden? Ich denke, dass dies nur in dem Fall passieren könnte, in dem die Dateigröße kleiner als die interne Puffergröße des Streamreaders ist. Aber wenn Sie so viele kleine Dateien lesen müssen, werden Sie wahrscheinlich auf andere Probleme mit Disk I / O
stoßen

Ich habe den Code leider nicht zur Hand. Es ist etwas, auf das ich vor einiger Zeit gestoßen bin und das ich seitdem im Kopf habe. Der Code befand sich in .NET und war im Wesentlichen ein direkter File.ReadAllBytes () vs FileStream.BeginRead () in einer for
blesh

Wenn sich die Kurven, die ihren Wirkungsgrad repräsentieren, kreuzen und das asynchrone E / A mit einem höheren Wert als die synchrone E / A-Kurve aus der Kreuzung austritt.
Thomas Eding

Antworten:


14

Leider lautet die Antwort: "Es kommt darauf an." Es wäre einfach für Sie, ein kleines Programm zu schreiben, um die Zeiten von asynchronen und synchronen Lesevorgängen empirisch zu bestimmen.

Es wird von vielen Faktoren abhängen. Werden sie auf rotierenden Festplatten, SSD oder einem Netzwerklaufwerk gespeichert? Welche Art von CPU verwenden Sie? Wie viele Sockel / Kerne? Laufen Sie in einer VM oder Bare-Metal? Führen Sie ein altes oder ein modernes Betriebssystem aus?


1
Ja, das habe ich mir gedacht. Ich hatte gehofft, es gäbe eine Art Studie, die als Richtlinie oder Faustregel herangezogen werden könnte.
Fleisch

9

Async hat 3 Hauptvorteile:

  1. Es senkt die CPU-Auslastung. Dies kann nützlich sein, wenn Sie auch CPU-schwere Vorgänge mit gerade gelesenen Daten ausführen.
  2. Durch die Verwendung einer asynchronen Infrastruktur lässt sich der Code leicht parallelisieren. Vor allem, wenn Sie viele Dateien lesen.
  3. Durch das Senden mehrerer Schreib- / Leseanforderungen an OS können OS und HW diese Vorgänge neu anordnen, um sie schneller abzuschließen. SATA2 hat eine solche Funktion.

Ich glaube, der Hauptvorteil des asynchronen Lesens liegt darin, dass Sie mit vielen Dateien arbeiten oder viel CPU-Leistung benötigen.


Beachten Sie für Punkt 2, dass es nichts optimiert, wenn die E / A-Operation der Engpass ist. Anders verhält es sich, wenn Sie parallel über RAID oder Netzwerk auf Dateien zugreifen, die sich auf verschiedenen Festplatten befinden.
Arseni Mourzenko

5
Hmm, ich habe Probleme zu verstehen, was du mit # 1 meinst. Ich würde sagen, dass es in der Praxis umgekehrt ist. Denn im asynchronen Fall ändern Sie jetzt Ihre Threads von blocked waiting for I/O(0% CPU) auf continue normal processing(> 0% CPU).
Isak Savo

3

Es hängt davon ab, ob

Zu beachten ist, wie teuer ein Kontextwechsel zwischen Prozessen ist. Node.JS ist so konzipiert, wie es ist, weil es davon ausgeht, dass das Ausführen eines Kontextwechsels sehr teuer ist und ansonsten viele Prozesse auf den IE warten, die den Computer zum Stillstand bringen.

Andererseits macht Erlang einen Prozesskontextwechsel sehr billig, sodass alles synchron sein kann und die Erlang-Laufzeit den Überblick über das Ganze behalten kann.

Also die zu berücksichtigenden Faktoren:

  • die Kosten einer Kontextwechseloperation
  • Die Geschwindigkeit der Festplatte für Suchvorgänge
  • Die Geschwindigkeit der Festplatte für Lesevorgänge
  • sind die Dateien im Cache

Und ich bin sicher, ich lasse ein halbes Dutzend Faktoren aus


2

Ich bin mir nicht sicher, ob es einen bestimmten "Punkt" gibt, aber es ist am sinnvollsten, wenn viele Threads arbeiten, da Sie so Ihre E / A mit anderen Arbeiten überlappen können. Wenn Sie freie Threads im Leerlauf haben, bietet das asynchrone Lesen keinen Vorteil. Nur wenn sich die Arbeitswarteschlangen füllen und Ihr Thread möglicherweise andere Aufgaben ausführt, anstatt auf E / A zu warten, bietet der asynchrone Dateizugriff Vorteile.


ja, das ist der springende Punkt beim Multithreading!
Vlad

1

Ich denke, das Problem ist hier nicht so sehr die Lesegeschwindigkeit, sondern die Latenz.

Wenn Sie von einem Netzwerklaufwerk oder von einem langsamen mechanischen Festplattenlaufwerk mit langen Warteschlangen lesen, wird die Leistung beim Lesen stark beeinträchtigt. Und wenn Ihre App auch das Lesen im GUI-Thread durchführt, in diesem Fall handelt es sich um eine sehr schlechte Anwendung, dann ist sie für den Benutzer schrecklich.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.