Zitat:
Na nee: Ich definier mir ein Array von Threads. Die werden niemals terminieren (außer bei Programmende). Ein Busyflag zeigt an, ob ein Thread gerade beschäftigt ist, oder nicht. Und wenn ein neuer Request von außen kommt, schau ich in der Liste nach, welcher denn frei ist. Der wird aktiviert und bearbeitet den Job. Wenn keiner frei ist, warte ich.
Hm
und meine Aussagen beziehen sich immer auf das Gesamtsystem. In diesem Falle gehe ich davon aus das die Socket Funktionen clevererweise die asynchrone/signaling Schnittstelle benutzen. Das ist der Weg den auch
INDY geht und der die geringste Last produziert wenn man zb. auf Sockets,
COM, USB etc.pp Schnittstellen warten muß. Unter Windows wohl gemerkt.
Aus dieser Sicht ist ein Thread-Pool erstmal direkt vergleichbar mit einer direkten Limitierung der zur Verfügung stehenden Sockets. Ob ich also nur 16 Threads in einem Pool alloziere = 16 Client-Sockets oder direkt nur 16 Sockets zulasse ist somit gleich bedeutend. Der einzisgte Unterschied ist nur das
1.) diese 16 Threads beim
OS prealloziert werden können, sprich Resourcen reserviert werden
2.) die Allokationen solcher Pool-Threads sich beschleunigt, wie bei einem Cache.
Von der Limitation der Anzahl der Verbindungen her gesehen ist es aber gleich. Nur diesen Modus unterstützt
INDY meines Wissens nach in seinem Pool.
Zitat:
Vermutlich stammt diese Zahl aus den Anfängen von Delphi, wo 486er noch gang und gäbe waren. Weiterhin dürften von 2000 Threads bei einem Portscanner 1999 warten, insofern sollte das nicht das Problem sein. Nur 2000 ständig laufende Threads zwingen nun jeden Computer in die Knie.
Stammen aus Delphi 5 Zeiten. Und exakt darum gehts hier auch bei der Frage. Denn in einer Socket Kommunikation ist eben das Warten auf Daten die zeitlich gesehen häufigste Operation. Es geht also um Serverlast und wie man diese gleichmäßig unter Windows verteilt. Und das geht über Threads die die meiste Zeit schlafen und erst aufwachen wenn sie asynchron durch das Socket
API per Events aufgeweckt werden.
Ob nun 2000 Clientthread-Sockets auf einem Windowssystem mit JAVA, Delphi oder C# alloziert werden ist dabei irrelevant. Entscheidend ist das
API das das
OS zur Verfügung stellt. Hier also das Socket
API und dessen Signaling und eben Threads.
Der Hinweis von Sakura ist also absolut korrekt, bezogen auf
INDY.
Entweder eine andere Blibliothek statt
INDY benutzen die es ermöglicht asynchron auf viele Sockets innerhalb weniger Threads zuzugreifen, oder eben wie Sakura es sagte die Zeitspanne der Clientverbindungen so kurz wie möglich halten. Das bedeutet das an an seinem Kommunikationprotokoll arbeiten muß. Sprich Sessionorientierte Clientverbindungen die zum Datenaustausch eben keine permanente Clientconnection benutzen sondern diese immer dynamisch aufbauen, Daten übertragen und sofort wieder abbauen.
Dies ist sowieso eine sehr gute Idee, egal ob man Windows oder Linux benutzt. Ich selber benutze nur diese Art der Kommunikation in meinen Systemen und wir hatten damit noch nie Serverlast Probleme. Viel kritischer waren da schon die Verbindungen zum
SQL Server, der hat wirklich Nerven gekostet.
Gruß Hagen