Dieser Inhalt wurde in Cnblogs oft diskutiert. Ich habe in den letzten zwei Tagen einige Informationen gelesen, einige einfache Leistungsindikatoren gesehen und sie mit allen besprochen.
Socket + Threads/ThreadPool
Ungefähre Leistung: weniger als 1500 Verbindungen
: Akzeptieren Sie einen Socket und überlassen Sie die Verwaltung. Dies ist relativ dumm, aber auch effektiver. Da es sich um eine synchrone Methode handelt, ist sie sehr bequem zu steuern. Die fortgeschrittenere Sache besteht darin, es zur Verwaltung an einen Thread-Pool zu übergeben. Der Thread-Pool wird automatisch vom System gehostet, wodurch Zeit für Overhead-Threads gespart wird. Für allgemeine kleine Projekte ist dies völlig ausreichend und die Entwicklung ist einfach. Beachten Sie jedoch, dass, wenn mehrere Sockets über einen längeren Zeitraum Threads im Thread-Pool belegen und viele andere Verbindungen vorhanden sind, leicht die Meldung angezeigt wird, dass nicht genügend Threads zur Verwendung vorhanden sind. Haha, es ist eine gute Idee, Socket weniger Arbeit leisten zu lassen und weniger Zeit in Anspruch zu nehmen. Der Wechsel zu einer schnelleren CPU ist eine gute Möglichkeit. Wenn es außerdem einige bessere Thread-Pool-Komponenten von Drittanbietern gibt, können Sie diese auch verwenden, z. B. SmartThreadPool.
Sockel+Auswählen
Ungefähre Leistung: Die Leistung nimmt nach mehr als 1500 Verbindungen ab.
Implementierung: Select ist ein sehr häufig verwendetes Modell. Dabei werden ein oder mehrere Sockets in der Blockierungsfunktion abgefragt und der zu verarbeitende Socket in eine IList eingefügt. Wenn die Auswahlabfrage abgeschlossen ist, verarbeiten wir den Socket selbst in dieser IList. Informationen zur spezifischen Verwendung finden Sie im MSDN. Man kann nicht sagen, dass die Effizienz von Select hoch ist, denn wenn viele Sockets in der Warteschlange verarbeitet werden müssen, entspricht die Verarbeitung der letzten paar Sockets dem Durchlaufen aller vorherigen Sockets, was sehr unwirtschaftlich ist.
Socket+Asynchron
Ungefähre Leistung: etwa 7500 Client-Verbindungen.
Implementierung: BeginXXXX, EndXXXX, wir alle kennen es. Letztendlich verwendet der asynchrone Socket weiterhin die Thread-Pool-Technologie und verwendet den Thread-Pool zur Verarbeitung asynchroner E/A. Dies wirft eine weitere Frage auf: Welche Implementierungsmethode wird für den Thread-Pool von .NET verwendet? Ich habe schon einmal gesehen, dass der Thread-Pool von .NET mithilfe von Abschlussports implementiert wird. Es gibt keine Möglichkeit, dies zu bestätigen anhand der Informationen, die ich gefunden habe (ich hoffe, ein Freund kann mir das sagen). Asynchroner Socket ist viel komplizierter als der synchrone Programmverarbeitungsablauf, und die Steuerung asynchroner Rückruffunktionen ist nicht so intuitiv wie die synchrone Methode. Ich denke jedoch, dass die Rückruffunktion nur geringfügig verwendet werden sollte und nicht zu viele Transaktionen verarbeiten sollte. Die Verarbeitung der übertragenen Daten sollte anderen Threads überlassen werden.
IOCP (Abschlussport)
Ungefähre Leistung: etwa 20.000 bis 50.000 Client-Verbindungen
: Es gibt einige Pseudo-IOCPs. Sie können nach ihnen suchen. Ich habe keine offenen SOCKET-Beispiele gesehen, die mit diesen Pseudo-IOCPs implementiert wurden. Die 20.000 bis 50.000 Client-Verbindungen, von denen ich spreche, beziehen sich auf die Entwicklungssituation unter C++. In diesem Fall müssen Speicherpools, Abfragealgorithmen usw. verwendet werden.
Es gibt keine Informationen zur Überprüfung der maximalen Anzahl von Verbindungen, die Pseudo-IOCP erreichen kann. Wenn jemand es weiß, können Sie darüber diskutieren. Darüber hinaus sind viele der oben genannten Daten Auszüge aus einigen Informationen, die ich nicht selbst ausprobiert habe, sondern nur zur Diskussion mit allen. Ich denke, dass ein leistungsstarkes Serverprogramm möglicherweise nicht nur die Technologie erfordert, welches Modell verwendet werden soll, sondern auch viele Details, auf die geachtet werden muss, z. B. die Speicherverarbeitung, der zu verwendende Algorithmus usw. Natürlich ist dies der Fall Nur was die Softwarekosten angeht, wird es definitiv Investitionen in Hardware geben.