Wie ist die Beziehung zwischen der Anzahl der CPU-Kerne und der Anzahl der Threads in einer App in Java?

8

Ich bin neu in Java multi-threaded Programmierung. Die Frage, die mir in den Sinn kam, ist, dass ich wie viele Threads entsprechend der Anzahl meiner CPU-Kerne ausführen kann. und wenn ich Threads mehr als CPU-Kerne verwende, ist das ein Overhead für den Rechner, um die App zu starten. Wenn wir zum Beispiel einen Server mit einer Server-Software haben, die 2 Threads ausführt (Haupt-Thread + Entwickler-Thread), ist das ein Overhead für den Server, wenn mehr gleichzeitige Clients Socket-Verbindungen zum Server herstellen oder nicht?

Danke.

    
Ramin 16.01.2014, 09:40
quelle

6 Antworten

5

Die Anzahl der Threads, die ein System gleichzeitig ausführen kann () ist (natürlich) identisch mit der Anzahl der Kerne im System.

Die Anzahl der Threads, die auf dem System existieren können, ist durch den verfügbaren Speicher begrenzt (jeder Thread benötigt einen Stack und eine Struktur, die vom Betriebssystem verwendet wird, um den Thread zu verwalten), und möglicherweise gibt es eine Begrenzung, wie viele Threads das Betriebssystem erlaubt (Dies hängt von der OS-Architektur ab, einige Betriebssysteme können eine Tabelle fester Größe verwenden und sobald sie voll ist, können keine weiteren Threads erstellt werden).

Im Allgemeinen können heutige Computer Hunderte bis Tausende von Threads verarbeiten.

Der Grund, warum im System mehr Threads als Cores vorhanden sind, ist: Die meisten Threads verbringen unweigerlich einen großen Teil ihrer Zeit mit waiting (Beispiel: Textverarbeitung wartet auf Eingabe auf der Tastatur) ). Das Betriebssystem verwaltet es, dass Threads, die auf diese Weise warten, keine CPU-Zeit verbrauchen.

    
Durandal 16.01.2014 09:52
quelle
3

Das hängt davon ab, was die Threads machen. Die CPU kann nur X-Dinge gleichzeitig tun, wobei X die Anzahl der Kerne ist, die es hat. Das bedeutet, dass X-Threads höchstens gleichzeitig aktiv sein können - die anderen Threads können jedoch warten, bis sie an der Reihe sind und die CPU sie in geeigneten Momenten verarbeiten wird.

Sie sollten auch bedenken, dass viele Zeit-Threads auf eine Antwort warten oder darauf warten, dass Daten geladen werden oder eine Netzwerknachricht eintrifft, usw. Sie versuchen also nicht, irgendetwas zu tun. Diese Leerlauf / wartenden Threads haben eine sehr geringe Belastung für das System.

    
Tim B 16.01.2014 09:43
quelle
3

Sorgen Sie sich nicht darum, eine höhere Anzahl von Threads als CPU-Kerne zu erhalten. das ist eigentlich nicht in deinen Händen, aber in OS '.

Angenommen, die JVM ordnet Ihre Java-Threads über OS-Threads zu (was heutzutage ziemlich normal ist), hängt es von der Thread-Verwaltung Ihres Betriebssystems ab. Dort verlassen Sie sich darauf, wie schlau die Kernel-Implementierung ist, um Leistung aus Ihren Kernen herauszuholen.

Was Sie beachten müssen ist, dass Ihr Design nachhaltig sein muss. Anwendungsserver werden beispielsweise auf einem Threadpool mit Worker-Threads erstellt. Diese Threads werden aktiviert, um Anfragen zu bedienen. Möchtest du für jede Anfrage einen Thread? Dann werden Sie sicherlich ein Problem haben - Anfragen können zu Tausenden auf den Server kommen, und das könnte ein Problem für den Kernel sein. Eigentlich sollte die Threadpool-Größe begrenzt sein (zwischen 1 und X und leicht geändert werden, sogar in Echtzeit), Threads sollten Arbeit von einer gleichzeitigen Queue erhalten (Java bietet Ihnen einige ausgezeichnete Klassen dafür) und jeder nimmt Anfragen sequentiell entgegen.

Ich hoffe, dass diese Hilfe ist

    
Jorge_B 16.01.2014 09:49
quelle
3

Die Idee dahinter ist: Lassen Sie Ihre CPU nicht schlafen und laden Sie sie auch nicht zu viel, so dass sie die meiste Zeit beim Threadwechsel verschwendet.

Es ist hilfreich, Poolgröße zu optimieren, in IBMs Papier

Die Idee dahinter ist, dass es von der Art der Aufgabe abhängt, ob Sie alle In-Memory-Berechnungsaufgaben mit N + 1 Threads (N Anzahl von Kernen (inklusive Hyper-Threading)) ausführen können.

Oder

Wir müssen die Anwendung Profiling und herauszufinden, Wartezeit (WT), Service-Zeit (ST) für eine typische Anfrage und ca. N * (1 + WT / ST) Anzahl der optimalen Threads können wir haben, unter Berücksichtigung von 100% Auslastung der CPU.

    
Rohit Sachan 16.01.2014 10:10
quelle
2

Weniger Threads als CPUs können bedeuten, dass Sie nicht alle CPUs in Ihrem System verwenden. Wenn mehr Threads verwendet werden, kann der Durchsatz verbessert werden, wenn die CPU der Engpass ist.

Wenn Sie mehr Threads als die CPU haben, entsteht ein Overhead und wenn die CPU der Engpass ist, kann dies die Performance beeinträchtigen. Wenn jedoch Netzwerk-IO Ihr Flaschenhals ist, ist dieser Overhead ein lohnender Preis, da er Ihnen normalerweise ermöglicht, viel mehr Verbindungen zu handhaben. z.B. Sie können 1000 TCP-Verbindungen mit ihren eigenen Threads haben.

    
Peter Lawrey 16.01.2014 09:47
quelle
0

Die beste Leistung wird sein, wenn die Anzahl der Kerne ( NOC ) der Anzahl der Threads entspricht ( NOT ), denn wenn NOT & gt; NOC dann Prozessor sollte Kontext wechseln oder OS wird versuchen, diese Arbeit zu tun, die teuer genug ist Operation. Aber Sie müssen verstehen, dass es unmöglich ist, NOC = NOT auf Web-Servern zu haben, weil Sie nicht vorhersagen können, wie viele Clients gleichzeitig sind. Sehen Sie sich das Lastausgleich Konzept an, um dieses Problem auf die beste Weise zu lösen.

    
Divers 16.01.2014 09:48
quelle