Server: Clients mit einzelnen Threads abarbeiten sinnvoll?
-
Hallo,
Ich wusste nicht, wo ich das Thema genau eröffnen sollte, aber da es eig. nichts mit dem Standard zu tun hat, habe ich es mal hier eröffnet. Ich programmiere gerade einen kleineren Server unter Windows für eine Art Chat. Wenn sich ein Client mit dem Server verbindet, wird für jeden Client ein eigener Thread erstellt, in dem der Server auf Daten des Clients wartet. Meine Frage ist jetzt: Ist das sinnvoll? Kann es passieren, dass der Server abschmiert, wenn zu viele Clients mit ihm verbunden sind, also wenn zu viele Threads erstellt wurden? Wäre es demnach sinnvoller mit 'select' zu arbeiten und sollte ich das deshalb nochmal umschreiben?
Würde mich über Antworten sehr freuen.
-
Das musst du abwägen. Jede Technik hat seine Grenzen. Für "wenig" Clients (was "wenig" bedeutet hängt vor allen Dingen von der Hardware ab) reicht ein Singlethread-Select()-Server. Für deine Zwecke sollte das schon reichen.
Die große Keule sind Threadpools, Overlapped I/O und I/O-Completionports.Ob dein Programm "abschmiert" hängt von deiner Fehlerbehandlung ab. Wenn Windows sagt, dass keine Threads mehr erstellt werden können, musst du das halt auswerten.
-
Ein Thread pro Client ist irrsinn. Benutze einen Thread pro CPU Core.
-
Das hat den Effekt, dass der Server dann nur 1, 2, 4, 8, whatever Clients gleichzeitig behandeln kann. Das ist viel zu wenig. Wenn ein Thread blockiert, kann der Scheduler ihm doch die Rechenzeit nehmen und einem anderen geben (wenn denn einer da ist). Sonst geht die Zeit an einen anderen Prozess. Wäre verschwendet.
-
Dafür gibts nonblocking Sockets und select...
-
Richtig erkannt. Das habe ich der TE auch im 2. Post empfohlen.
Das von dir vorgeschlagene Modell lohnt sich nur für IOCPs.
-
314159265358979 schrieb:
Ein Thread pro Client ist irrsinn. Benutze einen Thread pro CPU Core.
Das (deine Aussage) ist Blödsinn.
Nur weil du irgendwo mal gelesen hast, dass asynchrones IO so schick ist, und die 1-Thread-pro-Client Archtektur ganz viel pfui und ganz viel langsam ist, heisst das noch nicht, dass es auch stimmt.
Lass dir von einem der es weiss, weil er damit bereits Erfahrung hat sagen: 1-Thread-pro-Client funktioniert bis einige 100 Clients ganz toll.
Ich bin mir auch sicher dass es sogar mit viel mehr Clients noch super geht. (Limit = Stack für die Threads muss noch in den Adressraum passen = bei 32 Bit Systemen und 1MB Stack bis ca. 2000 Clients)
-
hustbaer schrieb:
1-Thread-pro-Client funktioniert bis einige 100 Clients ganz toll.
Ich bin mir aus sicher dass es sogar mit viel mehr Clients noch super geht. (Limit = Stack für die Threads muss noch in den Adressraum passen = bei 32 Bit Systemen und 1MB Stack bis ca. 2000 Clients)+1!
-
hustbaer schrieb:
1-Thread-pro-Client funktioniert bis einige 100 Clients ganz toll.
Ich bin mir aus sicher dass es sogar mit viel mehr Clients noch super geht. (Limit = Stack für die Threads muss noch in den Adressraum passen = bei 32 Bit Systemen und 1MB Stack bis ca. 2000 Clients)-1!
-
hustbaer schrieb:
1-Thread-pro-Client funktioniert bis einige 100 Clients ganz toll.
Ich bin mir auch sicher dass es sogar mit viel mehr Clients noch super geht. (Limit = Stack für die Threads muss noch in den Adressraum passen = bei 32 Bit Systemen und 1MB Stack bis ca. 2000 Clients)Hab nie gesagt, dass es nicht so ist.
-
hustbaer schrieb:
314159265358979 schrieb:
Ein Thread pro Client ist irrsinn. Benutze einen Thread pro CPU Core.
Das (deine Aussage) ist Blödsinn.
Nur weil du irgendwo mal gelesen hast, dass asynchrones IO so schick ist, und die 1-Thread-pro-Client Archtektur ganz viel pfui und ganz viel langsam ist, heisst das noch nicht, dass es auch stimmt.
Lass dir von einem der es weiss, weil er damit bereits Erfahrung hat sagen: 1-Thread-pro-Client funktioniert bis einige 100 Clients ganz toll.
Ich bin mir auch sicher dass es sogar mit viel mehr Clients noch super geht. (Limit = Stack für die Threads muss noch in den Adressraum passen = bei 32 Bit Systemen und 1MB Stack bis ca. 2000 Clients)Auf x64er-Systemen ist das durchaus wieder eine sinnvolle Option. Auf x86 ist es zu speicheraufwändig für größere Sachen.