Effiziente Anzahl von Threads

7

Ich möchte meine Anwendungsanzahl von Threads optimieren. Fast alle von ihnen haben IO neben der CPU-Nutzung in einem gleichen Wert. Wie hoch ist die effiziente Anzahl von Threads, wenn keine anderen Anwendungen im System ausgeführt werden? Ich möchte die Antwort für Windows und unter JVM.

    
Shayan 03.02.2010, 16:03
quelle

6 Antworten

12

Es gibt keine Antwort pro Betriebssystem. Dies hängt von den spezifischen Aufgaben ab, die Ihr Code ausführt. Sie sollten Ihre Anwendung mit verschiedenen Konfigurationen vergleichen, um zu sehen, welche die leistungsfähigste ist.

Einige allgemeine Tipps zum Multithreading:

  • Sie können nicht beschleunigen wie Aufgaben mit mehr Threads; Ausnahme: Wenn Sie mehrere CPUs haben, können Sie Compute-Tasks mit einem Thread pro CPU parallelisieren, sofern diese Logik so aufgeteilt werden kann, dass sie nicht unbedingt seriell ausgeführt werden muss. Ein gutes Beispiel dafür wäre ein Divide-and-Conquer-Problem wie Mergesort, bei dem die beiden Hälften in beliebiger Reihenfolge sortiert werden können.

  • Sie können eine gewisse Beschleunigung erzielen, indem Sie Aufgaben parallelisieren, die nicht denselben Teil der Maschine verwenden. Wenn Sie also sagen, dass Sie "gleiche Werte" für I / O- und Compute-Tasks haben, wollen Sie diese in verschiedene Threads aufteilen. Dies setzt wiederum voraus, dass die Reihenfolge nicht wichtig ist.

Wenn es (wie bei vielen Anwendungen) der Fall ist, dass Threads irgendeine Rechenlogik ausführen, gefolgt von einigen I / O-Operationen (wie das Schreiben der Daten auf die Festplatte oder einen Datenbankserver), dann wird es sehr schwierig sein, darauf zu kommen mit einer Formel, um die genaue Anzahl der Threads zu bestimmen, die Sie haben sollten, da dies stark davon abhängt, welche Daten Sie verarbeiten, wie Sie sie verarbeiten und was Sie damit machen, wenn die Verarbeitung abgeschlossen ist. Deshalb ist es am besten, wenn Sie einen konfigurierbaren Thread-Pool haben, dessen Größe leicht angepasst werden kann - dann führen Sie einige Belastungstests mit verschiedenen Größen durch und sehen Sie, welche am besten funktioniert.

    
danben 03.02.2010, 16:06
quelle
9

Das Java Concurrency in Practice Buch gibt eine grobe Formel für die Dimensionierung eines Thread-Pools, um Ihre CPUs bei einer bestimmten Auslastung zu halten:

  

N = Anzahl der CPUs

     

U = Ziel-CPU-Auslastung, 0 & lt; = U & lt; =   1

     

W / C = Verhältnis von Wartezeit zu Berechnung   Zeit

     

Die optimale Poolgröße (Anzahl von   Threads) für das Halten von Prozessoren bei   gewünschte Verwendung ist:

     

PoolSize = N * U * (1 + (W / C))

Dies ist jedoch nur für die CPU-Auslastung.

Sie können die verfügbaren Prozessoren mit Runtime abrufen. getRuntime (). availableProcessors ()

    
Kevin 03.02.2010 16:07
quelle
2

Ich glaube nicht, dass es eine definitive Antwort darauf gibt. Ich würde nur vorschlagen, Ihre Anwendung mit verschiedenen Anzahlen von Threads zu testen und zu sehen, welche die beste Leistung zeigt. Ein Platz zum Starten wäre ein Thread mehr als die Anzahl der Prozessor-Threads in Ihrer Hardware, z. Wenn Sie einen Dual-Core-Prozessor mit einem Thread pro Kern haben, verwenden Sie 3 Threads.

    
Poindexter 03.02.2010 16:08
quelle
2

Leistung ist bei weitem nicht der einzige Grund, Threads zu verwenden.

Grundsätzlich kann jedes Multithread-Programm mit einem einzigen komplexeren Thread simuliert werden. Was die Threads tatsächlich tun, ist die Vereinfachung Ihres Codes, was nicht unbedingt schneller ist.

Wenn Ihre App mehrere Kerne oder mehrere gleichzeitig funktionierende Disk-Köpfe nutzen könnte, könnten die Threads dies leicht ausnutzen. In diesem Fall brauchen Sie wahrscheinlich keine Threads mehr, als Sie separate Kerne oder Köpfe haben, weil Prozesswechsel einen definitiven Preis haben.

    
Mike Dunlavey 03.02.2010 23:11
quelle
1

Ich fand, dass der beste Weg, damit umzugehen, ist, Threads nicht direkt zu verwenden, sondern das Executor-Framework zu verwenden. Sie können mit den verschiedenen Konfigurationen experimentieren, aber ich fand, dass ich CallerRunsPolicy mochte.

    
ishmeister 03.02.2010 16:38
quelle
0

Darauf gibt es wirklich keine universelle Antwort. Die Anzahl der erstellten Threads hängt davon ab, wie viele Aufgaben Sie ausführen, wie sie kommunizieren und wie Sie Ihre Anwendung gestalten. Ich habe extrem große Apps gehabt, die nur einen Thread haben, der gut läuft. Auf der anderen Seite habe ich auch kleine Anwendungen, die mehrere Threads für Leistung willen vorgeschrieben.

(Sorry für alle Rechtschreib- / Formatierungsprobleme, ich tippte das von meinem Telefon ab)

    
Luke Cycon 03.02.2010 16:13
quelle