Wie viele Socket-Verbindungen möglich?


77

Hat jemand eine Idee, wie viele TCP-Socket-Verbindungen auf einem modernen Standard-Root-Server möglich sind? (Es gibt im Allgemeinen weniger Verkehr auf jeder Verbindung, aber alle Verbindungen müssen ständig aktiv sein.)

EDIT: Wir werden einen Linux Server verwenden.


1
Siehe für Windows diese Frage [Was ist die maximale Anzahl von gleichzeitigen Windows-TCP / IP-Verbindungen?] [1] [1]: stackoverflow.com/questions/413110/…
lsalamon

Antworten:


86

Ich habe 1600k gleichzeitige Leerlauf-Socket-Verbindungen und gleichzeitig 57k Anforderungen auf einem Linux-Desktop (16G RAM, I7 2600 CPU) erreicht. Es ist ein einzelner Thread-HTTP-Server, der in C mit epoll geschrieben wurde. Der Quellcode ist auf Github , einem Blog hier .

Bearbeiten:

Ich habe mit JAVA / Clojure 600.000 gleichzeitige HTTP-Verbindungen (Client und Server) auf demselben Computer hergestellt. Detailinfo- Beitrag , HN-Diskussion: http://news.ycombinator.com/item?id=5127251

Die Kosten für eine Verbindung (mit Epoll):

  • Anwendung benötigen etwas RAM pro Verbindung
  • TCP-Puffer 2 * 4k ~ 10k oder mehr
  • epoll benötigt etwas Speicher für einen Dateideskriptor von epoll (7)

Jeder registrierte Dateideskriptor kostet ungefähr 90 Bytes auf einem 32-Bit-Kernel und ungefähr 160 Bytes auf einem 64-Bit-Kernel.


2
hahaha ... 10 Millionen Verbindungen highscalability.com/blog/2013/5/13/…
Lothar

5
@ Bangash Mein Kommentar hat absolut nichts mit Erlang zu tun, oder wirklich etwas anderes als die Tatsache, dass leef einen Kommentar über 1 Million Socket-Verbindungen auf einer einzelnen Box gepostet hat, aber diese Antwort spricht über 1,6 Millionen - daher schien es ein bisschen wie ein dummer Kommentar. Erlang ist großartig - macht CouchDB. Ich sehe jedoch nicht, wie Ihr Kommentar hier relevant ist.
Wallacer

23

Dies hängt nicht nur vom jeweiligen Betriebssystem ab, sondern auch von der Konfiguration, möglicherweise in Echtzeit.

Für Linux:

cat /proc/sys/fs/file-max

zeigt die aktuelle maximale Anzahl von Dateideskriptoren an, die insgesamt gleichzeitig geöffnet werden dürfen. Überprüfen Sie http://www.cs.uwaterloo.ca/~brecht/servers/openfiles.html


1
Ich habe gerade meinen Ubuntu (13.04) Laptop überprüft ... 386491. Ich bezweifle, dass dies das erste Limit sein wird, auf das ich stoßen würde.
Gerry

Auf meinem Debian instabil (Kernel 4.19.0-1-amd64): 18446744073709551615 .;)
Per Lundberg

8

10.000? 70.000? ist das alles :)

FreeBSD ist wahrscheinlich der Server, den Sie möchten. Hier ist ein kleiner Blog-Beitrag über die Optimierung für 100.000 Verbindungen. Es enthält seit einiger Zeit einige interessante Funktionen wie Zero-Copy-Sockets sowie Kqueue als Abschluss-Port-Mechanismus.

Solaris kann im letzten Jahrhundert 100.000 Verbindungen verarbeiten !. Sie sagen, Linux wäre besser

Die beste Beschreibung, auf die ich gestoßen bin, ist diese Präsentation / dieses Papier zum Schreiben eines skalierbaren Webservers. Er hat keine Angst, es so zu sagen, wie es ist :)

Gleiches gilt für Software: Die Cretins auf der Anwendungsschicht erzwangen große Innovationen auf der Betriebssystemschicht. Da Lotus Notes eine TCP-Verbindung pro Client offen hält, hat IBM wichtige Optimierungen für den Fall "Ein Prozess, 100.000 offene Verbindungen" für Linux vorgenommen

Der O (1) -Planer wurde ursprünglich entwickelt, um bei irrelevanten Java-Benchmarks gute Ergebnisse zu erzielen. Das Fazit ist, dass dieses Aufblähen uns allen zugute kommt.


2
Ich habe bei 70.000 angehalten, weil es mehr war, als mein Kunde verlangte. Der Test war also bestanden. Bei Änderungen bei der Berechnung der nicht ausgelagerten Poollimits würde ich mir vorstellen, dass ein Windows Server 2008-Computer mit 100.000 Verbindungen kein Problem haben würde.
Len Holgate

Können Sie den Link zu der von Ihnen zitierten Präsentation teilen?
Brian Cline

1
@BrianCline Du brauchst das wahrscheinlich nicht mehr, aber ich wollte es auch und ich glaube ich habe es gefunden: slidehare.net/Arbow/scalable-networking (Folie 33)
Piyin

6

Im Dateisystem / proc kann die Anzahl der offenen Sockets begrenzt werden

cat /proc/sys/fs/file-max

Max für eingehende Verbindungen im Betriebssystem, definiert durch ganzzahlige Grenzwerte.

Linux selbst erlaubt Milliarden offener Sockets.

Um die Sockets verwenden zu können, muss eine Anwendung lauschen, z. B. ein Webserver. Dabei wird eine bestimmte Menge RAM pro Socket benötigt.

RAM und CPU werden die wirklichen Grenzen einführen. (modernes 2017, denke Millionen nicht Milliarden)

1 Million ist möglich, nicht einfach. Erwarten Sie X Gigabyte RAM für die Verwaltung von 1 Million Sockets.

Ausgehende TCP-Verbindungen sind durch Portnummern ~ 65000 pro IP begrenzt. Sie können mehrere IP-Adressen haben, jedoch nicht unbegrenzte IP-Adressen. Dies ist eine Grenze in TCP, nicht in Linux.


5

Unter Linux sollten Sie epoll für asynchrone E / A verwenden. Es könnte sich auch lohnen, Socket-Puffer zu optimieren, um nicht zu viel Kernel-Speicherplatz pro Verbindung zu verschwenden.

Ich würde vermuten, dass Sie in der Lage sein sollten, 100.000 Verbindungen auf einem vernünftigen Computer zu erreichen.


3

hängt von der Anwendung ab. Wenn es nur wenige Pakete von jedem Client gibt, ist 100K für Linux sehr einfach. Ein Ingenieur meines Teams hatte vor Jahren einen Test durchgeführt. Das Ergebnis zeigt: Wenn nach dem Herstellen der Verbindung kein Paket vom Client vorhanden ist, kann Linux Epoll 400.000 fd auf Lesbarkeit bei einer CPU-Auslastung von weniger als 50% überwachen.


1

Welches Betriebssystem?

Wenn Sie auf Windows-Computern einen Server schreiben, der gut skaliert werden kann und daher E / A-Abschlussports und asynchrone E / A verwendet, besteht die Hauptbeschränkung in der Menge des nicht ausgelagerten Pools, den Sie für jede aktive Verbindung verwenden . Dies führt direkt zu einer Begrenzung, die auf der von Ihrem Computer installierten Speichermenge basiert (nicht ausgelagerter Pool ist eine endliche Menge mit fester Größe, die auf dem installierten Gesamtspeicher basiert).

Für Verbindungen, die nicht viel Verkehr sehen, können Sie sie effizienter gestalten, indem Sie "Null-Byte-Lesevorgänge" veröffentlichen, die keinen nicht ausgelagerten Pool verwenden und das Limit für gesperrte Seiten nicht beeinflussen (eine weitere potenziell begrenzte Ressource, die Sie möglicherweise verhindert viele Steckdosen offen haben).

Abgesehen davon müssen Sie ein Profil erstellen, aber ich habe es geschafft, mehr als 70.000 gleichzeitige Verbindungen auf einem bescheiden spezifizierten Server (760 MB Speicher) herzustellen. Weitere Informationen finden Sie hier http://www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html .

Wenn Sie eine weniger effiziente Architektur wie "Thread pro Verbindung" oder "Auswahl" verwenden, sollten Sie natürlich weniger beeindruckende Zahlen erwarten. Aber meiner Meinung nach gibt es einfach keinen Grund, solche Architekturen für Windows-Socket-Server auszuwählen.

Edit: siehe hierhttp://blogs.technet.com/markrussinovich/archive/2009/03/26/3211216.aspx ; Die Art und Weise, wie die Menge des nicht ausgelagerten Pools berechnet wird, hat sich in Vista und Server 2008 geändert, und es ist jetzt viel mehr verfügbar.


Hmm. Interessant. Mit 128 MB nicht ausgelagertem Pool auf W2K und IOCP konnte ich 4.000 aktive Sockets (z. B. gleichzeitiges Streaming) aufrechterhalten . Wenn diese Steckdosen im Leerlauf sind, könnte ich ungefähr 16.000 aushalten. Ich vermute, Ihre Sockets sind inaktiv und / oder dieses Null-Byte-Leseticket hat geholfen.

Aktiv definieren. Sie führen den Testclient auf einem anderen Computer aus? Sie verwalten die Datenmenge, die Sie senden, mithilfe einer Flusskontrolle? Meine Sockets haben Nachrichten wiedergegeben, aber kein Null-Byte-Lesen verwendet. Sie liefen nicht auf Hochtouren und strömten Daten so schnell wie möglich.
Len Holgate

Ich dachte, Sie könnten unter Windows nur 65.000 Verbindungen herstellen - Sie müssen die Registrierungseinstellung tcpnumconnections bearbeiten. (und unter XP wird es in tcpip.sys weiter eingeschränkt, auf Bittorrent-Sites wurde viel darüber gesprochen)
gbjbaanb

2
Du wirst verwirrt, denke ich. Das Limit in tcpip.sys gilt für halboffene Verbindungen und begrenzt die Anzahl der gleichzeitigen Verbindungen, die gleichzeitig ausgeführt werden können. Der MaxUserPort-Registrierungseintrag beschränkt die Anzahl der Client-Ports, sodass der maximale Wert, den Sie dort festlegen können, die Anzahl der OUTBOUND-Verbindungen begrenzt, die Sie herstellen können. Die Anzahl der möglichen INBOUND-Verbindungen ist unbegrenzt.
Len Holgate

-12

Realistisch gesehen werden für eine Anwendung mehr als 4000-5000 offene Sockel auf einer einzelnen Maschine unpraktisch. Das bloße Überprüfen und Verwalten aller Sockets auf Aktivitäten wird zu einem Leistungsproblem - insbesondere in Echtzeitumgebungen.


3
Zu breite Aussage. In Wirklichkeit hängt alles davon ab, was Sie auf der Anwendungsebene tun. Das wird in fast allen Fällen Ihr Leistungsengpass sein.
DarkSquid

In Wirklichkeit gibt es viele funktionierende Server, die diese Anzahl gleichzeitiger Verbindungen bei weitem überschreiten.
Marquis von Lorne
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.