Socket ThreadPool oder Thread pro Client?

Stroker89

Bekanntes Mitglied
Hallo,

ich habe einen recht simplen Server geschrieben, der eigentlich nix weiter macht als XML Strings entgegen zu nehmen, diese auszuwerten, eine Aktion auszuführen und ein XML Ergebnis zurück zu schicken. Das ganze ist momentan so aufgebaut, dass der Server die Verbindung entgegen nimmt, und dann für jeden Client einen Thread aufmacht. Das Ganze funktioniert soweit auch eigentlich ganz gut.

Das System soll sehr viele User gleichzeitig behandeln können.
Angenommen es würden sich rein theoretisch 1000 User verbinden, würde der Server ja 1000 Threads aufmachen. Stellt das irgendwie ein Problem dar? Wo liegt die Grenze bei diesem Verfahren?

Jetzt habe ich auch von den ThreadPools gehört, die ja die Threads cachen können und man die Threadanzahl ja auf die Kerne/Prozessoren der jeweiligen Maschiene festsetzen kann, sehe ich das richtig? Wie steht das es dann hier um meine Mutliclientanforderung (viele Clients), wenn dann angenommen nur 4 oder 8 Threads im Pool sein dürfen? Was passiert wenn mehr Clients gleichzeitig kommen.

Wäre dankbar über eine Erläuterung.

Gruß
 
T

trääät

Gast
nun ... zunächst sind einzelne Threads pro Client bis einige 1000 threads kein problem ... allerdings muss man dafür der VM schon einige resourcen bereitstellen (über cli-parameter) ... aber auch hier ist irgendwann die grenze erreicht denn das system muss ja die unzahl an threads koordinieren ...

ein ThreadPool hingegen hat eine feste anzahl an Threads die wiederverwendet werden ...
der unterschied besteht hier das halt nicht für jede verbindung sofort ein neuer client-thread gestartet sondern automatisch auf den nächsten freien thread gewartet und dieser dann wiederverwendet wird ...

damit ist dann das system nicht ganz so beansprucht da weniger verwaltungsaufwand für eine unzahl an threads draufgeht sondern nur entsprechend der kernzahl ein sehr geringes vielfaches davon verwendet wird ...

das problem was sich daraus zwangsläufig ergibt ist die sequenzierung ... also das nicht mehr 1000 clients GLEICHZEITIG (was ja so eh nur "theoretisch" wäre) sondern halt immer nur soviele wie es threads im threadpool gibt ... und der rest wird dann hinten dran gestellt und muss warten bis die resourcen wieder frei sind ...

in wie weit das jetzt auswirkungen auf long-time ops hat und damit eventuelle socket-timeouts weis ich nicht ... wäre aber auf jeden fall ein punkt bei dem man sicher weiter erkundigen müsste ...

die andere möglichkeit wäre noch NIO ... aber da müssten dir andere helfen ... habe davon keine ahnung
 

tfa

Top Contributor
Tausende Threads würde ich auf jeden Fall verhindern. Das bringt nur Probleme. Google mal nach "java nio channel selector".
 

Stroker89

Bekanntes Mitglied
Erstmal vielen Dank ihr beiden, für die Erläuterungen und Tipps :) Ich werd mich mal erkundigen.
Das theoretisch war auf jetzt bezogen. Der Server wird definitiv so beansprucht.

Gruß
 

Stroker89

Bekanntes Mitglied
Ich hab mir jetzt mal ein paar Seiten angeschaut. In keinem der Beispiele werden eigene Threads für die Verbindung zum Client benutzt. Ist das bei NIO nicht mehr nötig oder was steckt dahinter?

@tfa: würdest du dann die Channels in einen festen ThreadPool, packen oder wie ist das gemeint?

Gruß
 

tfa

Top Contributor
Nein, mit NIO brauchst du dann keine Threads für die Connections bzw. Channels. Richtig gearbeitet habe ich auch noch nicht damit. Programmier eins der Beispiele nach und vergiss erstmal den Threadpool. Den kannst du einführen, wenn die Datenverarbeitung mit den XML-Files länger dauert.
 

Stroker89

Bekanntes Mitglied
Das ganze Projekt was ich grad mach ist für meine Bachelorthesis. Ich denke mal, dass ich dort NIO als Alternative zu der konventionellen threadbasierenden Behandlung der Clients aufführen und erläutern werde.

Eventuell werde ich auch noch ein kleines Beispiel dazu schreiben mal sehen. Aber soweit erstmal vielen vielen Dank für deine Erklärung. :)

Gruß
 
T

tuxedo

Gast
Kleiner Tipp: Schau dir Apache MINA oder JBoss NETTY an. Java NIO zu Fuß ist wirklich nicht schön und die Performance ist schnell schlechter als bei Java IO wenn du's nicht richtig anstellst.

Kurz noch zu "Warum braucht IO keinen dedizierten Thread für einen Client":

Bei NIO wird ein "Event" ausgelöst wenn ein Client Daten schickt oder sich ein neuer Client verbindet (Non-Blocking-IO). Du kannst also die "Event"-Verarbeitung von einem Thread-Pool erledigen lassen und somit die Anzahl der Threads quasi selbst bestimmen. Wenn du 1000 Clients hast, aber nur 10 Threads dafür bereit stellst, könnte es unter Umständen sein dass ein Client sozusagen etwas warten muss bis auf dem Server ein Thread Zeit für ihn hat. D.h. hier gehen, wenn der Server am Limit läuft, nur einzelne Client-Verbindungen in die Knie.

Bei Java IO, wo du für jeden Client einen Thread hast, gehen eher alle Clients gleichermaßen in die Knie wenn die Last am Server zu hoch wird.

Kurzum: Für wirklich viele gleichzeitige Verbindungen ist NIO mit Java6 die einzige Wahl.

Mit Java7 gibt's nun auch AIO. Ist sehr mit NIO verwand, ist auch Non-Blocking, aber die tatsächliche IO-Verarbeitung passiert außerhalb von Java. Ist praktisch beim Senden: Du gibts ein paar Bytes zum Senden an das OS in Auftrag, und die erhälst einen Callback wenn das OS damit fertig ist. Somit triggert ein Callback das Senden des nächsten Paketes. --> ist nochmal performanter als NIO.

- Alex

[EDIT]Geht zwar im File-IO, aber für Netzwerk funktioniert AIO prinzipiell genau so:
http://www.java-forum.org/allgemeine-java-themen/131309-java7-faszination-file-aio-2.html#post860436[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
T

trääät

Gast
ich habe neulich auf YT einen vlog eines uni-semesters gesehen in dem es zwar nicht speziell um IO / NIO / AIO ging ... jedoch wurde es als möglichkeit ebenfalls angesprochen ...

vom dozenten wurde erklärt das NIO / AIO nur noch teilweise bis eigentlich garnicht mehr in der VM-welt laufen sondern über bestimmte aufrufe einfach direkt ans betriebssystem weitergereicht werden ... und dadurch die optimierung des OS nutzen können was in der regel für den call selbst einen performance-gewinn bringt ... sowohl resourcen-management technich als auch geschwindigkeitsmäßig ...

jedoch gibt es eine stolperfalle : NIO / AIO sind sehr "low-level" (ausdrucksweise des dozenten) und man muss vieles was bei normalen IO bereits in der API gemacht wird selbst machen ... dadurch ergibt es meist mehr code als mit normalen IO ... und dadurch das mehr auszuführen ist und dies manchmal sehr kompliziert werden kann passiert es meist das bei "einfacher" anwendung von NIO / AIO eben dieser mehr-aufwand in der VM zu einer größeren performance-bremse wird als man durch NIO / AIO selbst an performance gewinnt

daher ist es meist ratsam wenn man NIO / AIO verwenden will bereits gut optimierte frameworks zu nutzen damit man sich den performance-vorteil nicht wieder durch eigenen unperformanten code wieder zu nichte macht ...
 
T

tuxedo

Gast
ich habe neulich auf YT einen vlog eines uni-semesters gesehen in dem es zwar nicht speziell um IO / NIO / AIO ging ... jedoch wurde es als möglichkeit ebenfalls angesprochen ...

vom dozenten wurde erklärt das NIO / AIO nur noch teilweise bis eigentlich garnicht mehr in der VM-welt laufen sondern über bestimmte aufrufe einfach direkt ans betriebssystem weitergereicht werden ... und dadurch die optimierung des OS nutzen können was in der regel für den call selbst einen performance-gewinn bringt ... sowohl resourcen-management technich als auch geschwindigkeitsmäßig ...

jedoch gibt es eine stolperfalle : NIO / AIO sind sehr "low-level" (ausdrucksweise des dozenten) und man muss vieles was bei normalen IO bereits in der API gemacht wird selbst machen ... dadurch ergibt es meist mehr code als mit normalen IO ... und dadurch das mehr auszuführen ist und dies manchmal sehr kompliziert werden kann passiert es meist das bei "einfacher" anwendung von NIO / AIO eben dieser mehr-aufwand in der VM zu einer größeren performance-bremse wird als man durch NIO / AIO selbst an performance gewinnt

daher ist es meist ratsam wenn man NIO / AIO verwenden will bereits gut optimierte frameworks zu nutzen damit man sich den performance-vorteil nicht wieder durch eigenen unperformanten code wieder zu nichte macht ...

Deine Ausführungen treffen voll und ganz für NIO zu. AIO ist aber komplett anders als NIO. Der "low level" Faktor ist hier quasi nicht vorhanden. Habe absolut keine großen Bedenken AIO ohne spezielles, ausgereiftes Framerwork einzusetzen. Bei NIO würde ich jedoch strengstens dazu raten ...

- Alex
 
Zuletzt bearbeitet von einem Moderator:

Stroker89

Bekanntes Mitglied
Soweit ich gelesen hab wird, in der aktuellen Alpha von Netty 4 AIO implementiert.
Für meine Arbeit hat das Wissen, was ihr mir mitgeteilt habt, momentan eh nur theoretischen Nutzen, da die endgültige Serverimplementierung nicht von mir durchgeführt wird.
Mich hat nur die Heransgehensweise an das Problem an sich interessiert.
Schön ist jetzt dass ich natürlich in meiner schriftlichen Arbeit, die genannten Techniken schön vergleichen kann :)

Gruß
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Server mit ThreadPool beenden Netzwerkprogrammierung 5
OnDemand Thread und Ratelimiter Netzwerkprogrammierung 4
F Thread "extern" beenden Netzwerkprogrammierung 3
OnDemand Linux RAM per Thread Netzwerkprogrammierung 3
V Socket Audio Clip loopen ohne neuen Thread Netzwerkprogrammierung 2
C Thread Netzwerkprogrammierung 9
platofan23 Socket Hilfe mit Socket Thread und ArrayList Netzwerkprogrammierung 6
A RMI RMI - Thread Objekte übertragen und auf anderer Machine weiterlaufen lassen Netzwerkprogrammierung 0
T Socket Server starten Thread Problem Netzwerkprogrammierung 12
P Wie spreche ich einen Thread an? Netzwerkprogrammierung 20
M Thread Scheduler Java 5.0? Netzwerkprogrammierung 2
7 Mehrere Verbindungen gleichzeitig in einem Thread mit ApacheHTTP Netzwerkprogrammierung 7
D Socket Dynamische Socket-Thread Erzeugung Netzwerkprogrammierung 2
B Socket Thread handling / Reader init Netzwerkprogrammierung 8
Z Socket Socket-Thread falsch? Netzwerkprogrammierung 5
Helgon Socket Thread Pooling Netzwerkprogrammierung 6
M Was macht Thread, wenn er aus einem "leeren" Inputstream liest ? Netzwerkprogrammierung 5
B callback thread udp Netzwerkprogrammierung 2
D RMI und Thread Netzwerkprogrammierung 4
S Kommunikationsproblem, Thread und manuel Netzwerkprogrammierung 4
U Socket Abhören eines Sockets/Ports in extra Thread Netzwerkprogrammierung 8
K ein Thread pro Stream Netzwerkprogrammierung 2
D Weiterer Thread auf Port 843 horcht Netzwerkprogrammierung 7
D Thread problem Netzwerkprogrammierung 3
S Thread, Daten vom Socket lesen Netzwerkprogrammierung 2
S Thread Transport Netzwerkprogrammierung 6
S Socket Thread in Schleife Netzwerkprogrammierung 4
G Objekte per TCP verschicken + Thread Netzwerkprogrammierung 4
T synchronized mit thread und rückgabe Netzwerkprogrammierung 4
Q Thread und Sockets... Netzwerkprogrammierung 2
2 Class mit ServerSocket erbt von Thread? Netzwerkprogrammierung 3
PAX Outputstream von anderem Thread verwenden lassen Netzwerkprogrammierung 5
C Server mit Multithreading (Thread-Pool) Netzwerkprogrammierung 2
E java.lang.NullPointerException aber nur wenns im Thread läuf Netzwerkprogrammierung 4
F EIN Thread in RMI auf Serverseite Netzwerkprogrammierung 3
G Server Thread beenden Netzwerkprogrammierung 16
T Socket-Thread: Designfrage Netzwerkprogrammierung 14
S Mit Thread arbeitende Maschine Netzwerkprogrammierung 6
T select() ohne NIO - oder wie Worker-Thread sauber beenden? Netzwerkprogrammierung 9
K Selbe Streams mehrfach nutzen (zusätl. Thread) Netzwerkprogrammierung 6
ven000m Thread Frage Netzwerkprogrammierung 11
B Thread.start() (run()) excption Netzwerkprogrammierung 2
M Thread läuft nicht weiter Netzwerkprogrammierung 2
B NullPointerException | Thread Netzwerkprogrammierung 4
U Current thread not owner Netzwerkprogrammierung 3
S readline-thread stoppt vorzeitig Netzwerkprogrammierung 6
J RMI - (RemoteException occurred in server thread) Netzwerkprogrammierung 2
S Webserverprogrammierung: Thread-Beschränkung Netzwerkprogrammierung 2
M Exception in thread "main" java.lang.NoClassDefFou Netzwerkprogrammierung 2
F problem mit thread bzw. netzwerkverbindung! Netzwerkprogrammierung 3
L netzwerk mit thread Netzwerkprogrammierung 3
G RMI thread safe ? Netzwerkprogrammierung 11
A Thread gibt Nachrichten mehrmals aus (Messenger in Java) Netzwerkprogrammierung 3
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
B Axis2 Webservice mit Client Zertifikat Authentifizierung Netzwerkprogrammierung 3
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
T Jetty mit Client-Zertifikat nur bei spezifischer URL Netzwerkprogrammierung 1
J Einlesen von Servernachrichten von TCP-Client Netzwerkprogrammierung 17
J Client-Server und SOAP Netzwerkprogrammierung 23
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
D Server - Client Informationsaustausch, Möglichkeiten Netzwerkprogrammierung 3
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
T Client zu Client Kommunikation Netzwerkprogrammierung 2
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
J client server mit nur einem PC Netzwerkprogrammierung 33
M Socket Nachricht von TCP-Client an Server schicken Netzwerkprogrammierung 12
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
G Server-Client IO Problem Netzwerkprogrammierung 6
ruutaiokwu ständig "sender address rejected: improper use of smtp" bei smtp-client Netzwerkprogrammierung 4
J HTTP [Java 9] Neuer HTTP Client - Tutorial Netzwerkprogrammierung 3
A Chatserver/-client - Code stoppt bei readUTF() Netzwerkprogrammierung 7
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
L Zugriffprobleme Client - Webservice AspenTechnology Netzwerkprogrammierung 0
A Client Client Übertragung Netzwerkprogrammierung 12
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
K Socket Netty Client wirft Fehler! Netzwerkprogrammierung 3
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
U Client Soap Verbindung wieder schließen Netzwerkprogrammierung 0
U Socket Client mit hash authentifizieren Netzwerkprogrammierung 3
F HTTP HTTP Rest Client mit TLS1.2 und selbst signiertem Zertifikat Netzwerkprogrammierung 2
P Server als Client nutzen Netzwerkprogrammierung 8
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
Cromewell Socket Multithreaded Server und Client Netzwerkprogrammierung 1
Y Client/Server/DB communication Netzwerkprogrammierung 3
JavaWolf165 Socket mit .writeUtf etwas vom Client zum Server schicken Netzwerkprogrammierung 13
J Client - Serversocket Netzwerkprogrammierung 1
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
brainless Client Server Kommunikation verschlüsseln Netzwerkprogrammierung 13
gamebreiti Socket Server / Client Anwendung Manipulation von Objekten durch Server Netzwerkprogrammierung 9
T Socket Server/Client Kommunikation Netzwerkprogrammierung 8
N Fragen zu Sockets Client Netzwerkprogrammierung 3

Ähnliche Java Themen


Oben