Viele Sockets
-
Hallo!
Mich beschäftigen zur Zeit ebenfalls Sockets. Mit Select und Poll/Epoll ist es ja möglich, viele Sockets auf einmal zu überwachen und normalerweise rät man hier im Forum dazu, Kommunikationssockets mit Epoll abzufragen und die Nachricht anschließend an alle zu senden.
In einem PHP-Tutorial über Sockets steht z.B., dass sie nach dem Abfragen mit Select gerademal 60 Nachrichten pro Sekunde senden konnten, sicher wird der Wert mit C/C++ höher sein, aber wenn ich jetzt eine Nachricht an viele Sockets sende, ist es dann nicht besser (aber sicher ressourcenaufwendiger), man pollt und sendet die Nachricht in einzelnen Threads, um eine zuverlässig schnelle Ausgabe bei allen Teilnehmern zu erhalten? Z.B. können nicht auch langsame Verbindungen das Skript aufhalten, ich bräuchte mich dann auch nicht mehr um die Verbindungen zu kümmern, bei denen nicht sofort übertragen werden kann, weil dann halt der Poll-Befehl etwas länger wartet und sich der einzelne Thread darum kümmert.
Danke für die Antworten + viele Grüße,
Marc
-
Dazu kann ich dir nur sagen: Probier es aus.
Es ist sicherlich leichter, die Sachen mit Threads zu machen, da sich das für einen Programmierer halt natürlicher anfühlt, wenn du alles der Reihe nach runterschreibst. Das Problem an der Sache ist, dass Threads relativ viel Speicher verbrauchen. Eine langsame verbindung verbraucht also viele Resourcen. Wenn die Verbindung sogar inaktiv ist, liegen die Resourcen für den Thread ungenutzt herum.
Wenn du mit select arbeitest, hält eine langsame Verbindung dein Programm nicht auf, im Gegansatz zu dem, was du gesagt hast. Wenn deine Sockets nicht blockieren, sendest oder empfängst du nur so viel, wie es gerade geht. Dein Programm wird nicht aufgehalten.
Der Grund, warum man epoll gegenüber select empfielt ist ganz einfach der, dass select recht ineffizient arbeitet, also immer langsamer wird, je mehr Verbindungen beobachtet werden.
Wenn du es dir einfach machen willst, nimm libevent.
Wenn du einen Mehrkernprozessor hast, dann wäre eine Kombination aus epoll und Threads sinnvoll, aber das wird erst bei weit über 1000 Verbindungen interessant.
-
Das Problem an Threads sind eher die vielen Context Switches die dann auftreten.