Geschwindigkeit Prozesse - Threads



  • Hallo!

    Da ich in C++ für Linux einen Chat mit eigenem Chatserver schreibe, habe ich eine Frage zum Geschwindigkeitsverhältnis von Prozessen und Threads.

    Wenn ich die Arbeit des Chatservers in Threads aufteile, befinden sich diese immer noch innerhalb eines Prozesses. Jede andere HTTP-Anfrage, z.B. Gästebucheintrag, Foreneintrag usw., an den ebenfalls auf dem Server laufenden Apache-Server belegt ebenfalls einen Prozess.

    Frage: Kann ich alleine mit Threads einen leistungsfähigen Chatserver schreiben, wenn damit mein ganzer Chatserver die gleichen Ressourcen bekommt wie jeder andere Prozess auch?

    Ist es daher ratsam, den Chatserver auf mehrere Prozesse aufzuteilen, wenn er leistungsfähig sein soll? Inwieweit würde der Befehl renice das Problem lösen?

    Viele Grüße, Marc



  • Einen Chat-Server auf mehrere Prozesse aufzuteilen halte ich nicht für klug, da die einzelnen Verbindungen ja untereinander Daten austauschen müssen. Würdest du mehrere Prozesse verwenden, so müssten sich die Prozesse untereinander ja auch noch "unterhalten". Das würde das ganze nur noch langsamer machen.

    Aber wie viele Verbindungen erwartest du denn, dass es da zu Problemen kommen kann? Wenn es ganz viele (so über 5000) werden, dann wäre für jede Verbindung einen Thread oder Prozess zu starten viel zu verschwänderisch, da der Overhead zu groß ist.



  • @Marc21Ja:
    Resourcen werden ja nicht nach dem Motto "jeder Prozess bekommt gleich viel" aufgeteilt, sondern nach dem Motte "jeder bekommt soviel wie er braucht".
    Also brauchst du nicht mehr als nur einen Prozess.

    Ansonsten guck dir doch mal die Boost.Asio an. Sollte auf jedem halbwegs aktuellen Linux-System vorhanden sein. Mit der kannst du recht einfach einen Chat-Server schreiben, ohne für jede Verbindung einen eigenen Thread zu starten, und ohne dich selbst um diverse Implementierungs-Details kümmern zu müssen.



  • Hi ihr!

    Erstmal vielen Dank für eure Rückmeldungen! 🙂

    Dann bin ich beruhigt. Ganz so hab ichs nicht gemacht:

    Threadlösung: Da das Schreiben und Lesen von Daten einige Zeit in Anspruch nimmt, die der Server nicht zum Rechnen benutzen kann, arbeitet der Chat zwar schon parallel mit Threads, aber er arbeitet pro Thread mehrere Aufgaben hintereinander ab. D.h., jede Aufgabe (Lesen, Schreiben usw.) bekommt eine bestimmte Rechenzeit "zugeteilt" und jeder Thread nimmt dann eine maximale Anzahl an Aufgaben ab, die er hintereinander abarbeitet.

    Prozesslösung: Klar, Chats, die pro User einen Prozess (vielleicht noch mit ständiger Zeilenabfrage über eine Datenbank) am Laufen haben, zwingt einen Server schon nach 200-300 Usern in die Knie. Ich dachte, wenn, eher an eine Lösung, in der die einzelnen Prozesse jeweils eine ganze Anzahl an Usern bedienen und ein zentraler Serverprozess wie eine Datenbank Daten/Anfragen der anderen Prozesse annimmt und die Daten schließlich an die Prozesse ausgibt, die sie an die User weitergeben.

    Wenn aber ein Prozess schon ausreicht, um einen performanten Chat herzustellen, der mit tausenden Verbindungen klarkommt, dann kann ich mir die Mühe vorerst sparen :-).

    Viele Grüße,
    Marc


Anmelden zum Antworten