/ / Was ist die optimale Anzahl von Threads zum Ausführen von IO-Operationen in Java? - Java, Multithreading, io

Was ist die optimale Anzahl von Threads zum Ausführen von IO-Operationen in Java? - Java, Multithreading, io

In Goetz "Java Parallelität in der Praxis", in einemFußnote auf Seite 101, schreibt er "Für Rechenprobleme wie diese, die nicht I / O und keine geteilten Daten zugreifen, ergeben Ncpu oder Ncpu + 1 Threads optimalen Durchsatz; mehr Threads helfen nicht und können sogar die Leistung verschlechtern ... "

Meine Frage ist, wenn ich I / O-Operationen durchführeWie das Schreiben von Dateien, das Lesen von Dateien, das Löschen von Dateien usw. gibt es Richtlinien für die Anzahl der zu verwendenden Threads, um maximale Leistung zu erzielen? Ich verstehe, dass dies nur eine Leitzahl sein wird, da Disk-Geschwindigkeiten und eine Vielzahl anderer Faktoren darin spielen.

Trotzdem frage ich mich: Können 20 Threads 1000 separate Dateien schneller auf die Festplatte schreiben als 4 Threads auf einen 4-CPU-Rechner?

Antworten:

11 für die Antwort № 1

In der Praxis können E / A-gebundene Anwendungen immer nochProfitieren Sie wesentlich vom Multithreading, da einige Dateien parallel schneller gelesen oder geschrieben werden können als sequentiell. Dies ist insbesondere der Fall, wenn der Gesamtdurchsatz durch die Netzwerklatenz beeinträchtigt wird. Es ist jedoch auch so, dass ein Thread das letzte verarbeiten kann, das er gelesen hat, während ein anderer Thread gerade mit dem Lesen beginnt, was eine höhere CPU-Auslastung ermöglicht.

Wir können den ganzen Tag über Theorie reden, aber die richtige Antwortsoll die Anzahl der Threads konfigurierbar machen. Ich denke, Sie werden feststellen, dass eine Erhöhung um mehr als 1 Ihre Geschwindigkeit erhöht, aber es wird auch ein Punkt mit abnehmender Rendite kommen.


3 für die Antwort № 2

Wie bei allen leistungsbezogenen Dingen kommt es darauf an.

Wenn Sie E / A-gebunden sind, hilft Ihnen das Hinzufügen von Threads überhaupt nicht. (Ok, wie Steven Sudit weist darauf hin, dass Sie möglicherweise eine Leistungssteigerung erzielen werden, die aber gering sein wird. Wenn Sie nicht E / A-gebunden sind, kann das Hinzufügen von Threads hilfreich sein

Versuchen Sie nicht, klug zu sein, aber der beste Weg, um herauszufinden, besteht darin, ein Profil zu erstellen und herauszufinden, was für Ihre speziellen Umstände geeignet ist.

Bearbeiten: Basierend auf Kommentaren aktualisiert


3 für die Antwort № 3

Siehe auch Verwenden Sie mehrere Threads mit einer RandomAccessFile-Hilfeleistung?

AKTUALISIEREN: Ich habe dort einen Benchmark hinzugefügt.


3 für die Antwort № 4

Ja, 20 Threads können definitiv auf die Festplatte schreibenschneller als 4 Threads auf einer 4-CPU-Maschine. Viele echte Programme sind mehr als E / A-gebunden als CPU-gebunden. Es hängt jedoch sehr detailliert von Ihren Festplatten ab und wie viel CPU-Arbeit Ihre anderen Threads ausführen, bevor auch sie auf diese Festplatten warten.

Wenn alle Threads ausschließlich auf die Festplatte schreibenWenn Sie nichts anderes tun, kann es sein, dass 1 Thread auf einer 4-CPU-Maschine der schnellste Weg zum Schreiben auf die Festplatte ist. Es hängt völlig davon ab, wie viele Festplatten Sie haben, wie viele Daten Sie schreiben und wie gut Ihr Betriebssystem bei der E / A-Planung ist. Aufgrund Ihrer spezifischen Frage möchten Sie, dass 4 Threads alle in dieselbe Datei schreiben Viel Sinn, und in jedem praktischen Szenario kann ich mir nicht vorstellen, wie das schneller wäre. (Sie müssen die Datei vorab zuweisen, dann würde jeder Thread an einer anderen Position suchen () und Sie würden am Ende einfach den Schreibkopf werfen, während jeder Thread versuchte, einige Blöcke zu schreiben.)

Der Vorteil von Multithreading ist viel einfacher, wenn Sie an ein Netzwerk gebunden sind. Das heißt: Warten auf einen Datenbankserver oder einen Webbrowser oder ähnliches. Dort warten Sie auf mehrere externe Ressourcen.


2 für die Antwort № 5

Wenn Sie synchrones I / O verwenden, sollten Sie dies tunhaben Sie einen Thread für jede gleichzeitige E / A-Anforderung, die Ihre Maschine verarbeiten kann. Im Falle einer einzelnen Spindel einer einzelnen Festplatte ist dies 1 (Sie können entweder lesen oder schreiben, aber nicht beide gleichzeitig). Bei einer Platte, die viele E / A-Anforderungen gleichzeitig verarbeiten kann, wären dies jedoch viele Anforderungen gleichzeitig.

Mit anderen Worten, dies ist nicht an die CPU-Anzahl gebunden, da die E / A die CPU nicht wirklich trifft, abgesehen von dem Senden von Anforderungen und dem Warten. Siehe hier für eine bessere Erklärung.

Es gibt eine ganze Reihe anderer Würmer mit der Anzahl der E / A-Anforderungen, die Sie zu einem bestimmten Zeitpunkt im Flug haben sollten.


1 für die Antwort № 6

Ncpu + erwartete Anzahl gleichzeitiger E / A-Aktivitäten ist meine übliche Anzahl.

Der Schlüssel ist nicht, dass 20 Threads eine Single schreiben könnenDatei auf Platte schneller als 4 Threads. Wenn Sie nur einen Thread pro CPU haben, kann Ihr Prozess während des Schreibvorgangs nicht die CPU verwenden, die den Thread hostet, der die Datei-E / A ausführt. Diese CPU wartet tatsächlich darauf, dass die Datei geschrieben wird. Wenn Sie jedoch einen weiteren Thread haben, kann die CPU in der Zwischenzeit echte Verarbeitung ausführen.


0 für die Antwort № 7

Wenn das einzige, was Sie mit diesen Threads tun, istWenn Sie auf die Festplatte schreiben, ist Ihre Leistungssteigerung vernachlässigbar oder sogar schädlich, da die Treiber normalerweise für sequentielle Lesevorgänge für Festplattenlaufwerke optimiert sind, sodass Sie ein sequentielles Schreiben in eine Datei in mehrere "zufällige" Schreibvorgänge transformieren.

Multithreading kann nur bei E / A-gebundenen Problemen helfen, wenn die E / A für verschiedene Festplatten, unterschiedliche Netzwerkkarten oder unterschiedliche Datenbankserver ausgeführt wird Leistungsbedingungen. Dennoch kann der Unterschied hinsichtlich der beobachteten Leistung viel größer sein.

Stellen Sie sich zum Beispiel vor, Sie senden mehrere Dateienzu vielen verschiedenen Empfängern durch ein Netzwerk. Sie sind immer noch an das Netzwerk gebunden, so dass Ihre maximale Geschwindigkeit nicht höher ist als beispielsweise 100 MBit / s. Wenn Sie jedoch 20 Threads verwenden, wird der Prozess durchgeführt viel fairer.