wake-up-neo.com

Wie viele Steckdosenanschlüsse sind möglich?

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 die ganze Zeit aktiv sein.)

EDIT: Wir werden einen Linux Server benutzen.

72
TheHippo

Ich erreichte 1600.000 gleichzeitige Leerlauf-Socket-Verbindungen und gleichzeitig 57.000 Anforderungen/s auf einem Linux-Desktop (16 GB RAM, I7 2600 CPU). Es ist ein Single-Thread-HTTP-Server, der mit epoll in C geschrieben wurde. Der Quellcode ist auf Github , ein Blog hier .

Bearbeiten:

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

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

  • anwendung benötigen einige RAM pro Verbindung
  • TCP-Puffer 2 * 4k ~ 10k oder mehr
  • epoll braucht 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.

83
shenedu

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

Für Linux:

cat /proc/sys/fs/file-max

zeigt die derzeit maximal zulässige Anzahl von Dateideskriptoren an, die gleichzeitig geöffnet werden dürfen. Check out http://www.cs.uwaterloo.ca/~brecht/servers/openfiles.html

22
Eddie

10.000? 70.000? ist das alles :)

FreeBSD ist wahrscheinlich der Server, den Sie wollen. Hier ein kleiner Blog-Beitrag über das Optimieren des Servers auf 100.000 Verbindungen. Es bietet seit einiger Zeit einige interessante Funktionen wie Zero-Copy-Sockets und Kqueue-Funktionen ein Vervollständigungsportmechanismus.

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

Die beste Beschreibung, auf die ich gestoßen bin, ist diese Präsentation/dieses Dokument 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 Anwendungsebene haben der Betriebssystemebene große Innovationen auferlegt. Da Lotus Notes eine TCP Verbindung pro Client offen hält, hat IBM wesentliche Optimierungen für den Fall "Ein Prozess, 100.000 offene Verbindungen" für Linux beigetragen

Der Scheduler O(1) wurde ursprünglich entwickelt, um bei einigen irrelevanten Java Benchmarks gute Ergebnisse zu erzielen. Das Fazit ist, dass dieses Aufblähen uns allen nützt.

8
gbjbaanb

Unter Linux sollten Sie die Verwendung von epoll für asynchrone E/A in Betracht ziehen. Es kann auch sinnvoll sein, die 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.

5
cmeerw

Eine Begrenzung der Anzahl offener Sockets kann im/proc-Dateisystem konfiguriert werden

cat /proc/sys/fs/file-max

Max. Für eingehende Verbindungen in dem durch ganzzahlige Grenzen definierten Betriebssystem.

Linux selbst erlaubt Milliarden offene Sockets.

Um die Sockets zu verwenden, benötigen Sie eine Anwendung, die z. ein Webserver, und das wird eine bestimmte Menge von RAM pro Socket verwenden.

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

1 Million ist möglich, nicht einfach. Erwarten Sie, dass Sie X Gigabyte RAM zur Verwaltung von 1 Million Sockets verwenden.

Ausgehende TCP) Verbindungen sind durch die Portnummern ~ 65000 pro IP begrenzt. Sie können mehrere IP-Adressen haben, aber nicht unbegrenzt IP-Adressen. Dies ist eine Beschränkung in TCP nicht Linux.

5
teknopaul

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

3
fatmck

Welches Betriebssystem?

Wenn Sie für Windows-Computer einen Server schreiben, der gut skaliert werden kann, und daher E/A-Abschlussports und asynchrone E/A verwenden, ist die Hauptbeschränkung die Menge des nicht ausgelagerten Pools, den Sie für jede aktive Verbindung verwenden . Dies führt direkt zu einer Begrenzung basierend auf der auf Ihrem Computer installierten Speicherkapazität (nicht ausgelagerter Pool ist eine begrenzte, feste Größe, die auf dem insgesamt installierten Speicher basiert).

Bei Verbindungen, bei denen nur wenig Datenverkehr zu verzeichnen ist, können Sie die Effizienz erhöhen, indem Sie 'Null-Byte-Lesevorgänge' veröffentlichen, die keinen nicht ausgelagerten Pool verwenden und sich nicht auf das Limit für gesperrte Seiten auswirken (eine weitere möglicherweise eingeschränkte Ressource, die Sie möglicherweise verhindert mit vielen offenen Socket-Verbindungen).

Abgesehen davon müssen Sie sich profilieren, aber ich habe es geschafft, mehr als 70.000 gleichzeitige Verbindungen auf einem bescheidenen Server (760 MB Speicher) zu erhalten. 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 offensichtlich mit weniger beeindruckenden Zahlen rechnen. Aber meiner Meinung nach gibt es einfach keinen Grund, solche Architekturen für Windows-Socket-Server zu wählen.

Bearbeiten: siehe hier http://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.

1
Len Holgate