web-dev-qa-db-fra.com

Combien de connexions possibles?

Quelqu'un at-il une idée du nombre de connexions tcp-socket possibles sur un serveur racine standard moderne? (En général, il y a moins de trafic sur chaque connexion, mais toutes les connexions doivent être actives tout le temps.)

EDIT: Nous allons utiliser un serveur Linux.

72
TheHippo

J'ai atteint 1600k connexions de socket inactives simultanées, et en même temps 57k req/s sur un bureau Linux (16G de RAM, I7 2600 CPU). C'est un serveur http à simple thread écrit en C avec epoll. Le code source est sur github , un blog here .

Modifier:

J'ai établi 600 connexions HTTP simultanées (client et serveur) sur le même ordinateur, avec Java/Clojure. informations détaillées post , discussion HN: http://news.ycombinator.com/item?id=5127251

Le coût d'une connexion (avec epoll):

  • l'application a besoin de RAM par connexion
  • Tampon TCP 2 * 4k ~ 10k ou plus
  • epoll a besoin de mémoire pour un descripteur de fichier, d’epoll (7)

Chaque descripteur de fichier enregistré coûte environ 90 octets sur un noyau 32 bits et environ 160 octets sur un noyau 64 bits.

83
shenedu

Cela dépend non seulement du système d'exploitation en question, mais également de la configuration, éventuellement de la configuration en temps réel.

Pour Linux:

cat /proc/sys/fs/file-max

montrera le nombre maximum actuel de descripteurs de fichier total autorisé à être ouvert simultanément. Départ http://www.cs.uwaterloo.ca/~brecht/servers/openfiles.html

22
Eddie

10 000? 70 000? est-ce tout :)

FreeBSD est probablement le serveur que vous voulez, voici un petit article de blog sur le réglage permettant de gérer 100 000 connexions, il propose depuis un certain temps des fonctionnalités intéressantes, telles que les sockets à copie zéro, ainsi que kqueue un mécanisme de port d'achèvement.

Solaris peut gérer 100 000 connexions au siècle dernier !. Ils disent que linux serait mieux

La meilleure description que j'ai trouvée est cette présentation/papier sur l'écriture d'un serveur web évolutif. Il n'a pas peur de le dire comme ça :)

Idem pour les logiciels: les crétins de la couche application ont imposé de grandes innovations à la couche OS. Étant donné que Lotus Notes maintient une connexion TCP par client ouverte, IBM a contribué à des optimisations majeures pour le cas "Un processus, 100 000 connexions ouvertes" avec Linux.

Et l’ordonnanceur O(1) a été créé à l’origine pour bien marquer des points de repère non pertinents Java. L'essentiel est que cela nous profite à tous.

8
gbjbaanb

Sous Linux, vous devriez envisager d'utiliser epoll pour les E/S asynchrones. Cela vaut également peut-être la peine d’affiner le tampon de socket pour ne pas gaspiller trop d’espace noyau par connexion.

Je suppose que vous devriez pouvoir atteindre 100 000 connexions sur une machine raisonnable.

5
cmeerw

Une limite du nombre de sockets ouverts est configurable dans le système de fichiers/proc

cat /proc/sys/fs/file-max

Max pour connexions entrantes dans le système d'exploitation définies par des limites entières.

Linux lui-même autorise milliards de sockets ouverts.

Pour utiliser les sockets, vous avez besoin d’une application à l’écoute, par exemple. un serveur Web, et qui utilisera une certaine quantité de RAM par socket.

La RAM et le CPU introduiront les limites réelles. (2017 moderne, pensez à des millions et non à des milliards)

1 million est possible, pas facile. Attendez-vous à utiliser X gigaoctets de RAM pour gérer 1 million de sockets.

sortantes TCP sont limitées par des numéros de port ~ 65 000 par IP. Vous pouvez avoir plusieurs adresses IP, mais pas illimitées. Adresses IP. Ceci est une limite dans TCP pas Linux.

5
teknopaul

dépend de l'application. s'il n'y a que quelques paquets de chaque client, 100K est très facile pour Linux. Un ingénieur de mon équipe a fait un test il y a quelques années. Le résultat indique: lorsqu'il n'y a plus de paquet du client après la connexion, linux epoll peut regarder 400k fd pour une lisibilité au niveau d'utilisation du processeur inférieur à 50%.

3
fatmck

Quel système d'exploitation?

Pour les machines Windows, si vous écrivez un serveur pour qu'il s'adapte correctement et que vous utilisiez par conséquent des ports de complétion E/S et des E/S asynchrones, la principale limitation est la quantité de pool non paginée que vous utilisez pour chaque connexion active. . Cela se traduit directement par une limite basée sur la quantité de mémoire installée par votre machine (le pool non paginé est une quantité finie, de taille fixe, basée sur la mémoire totale installée).

Pour les connexions qui ne voient pas beaucoup de trafic, réduisez-les et améliorez leur efficacité en publiant des "lectures de zéro octet" qui n'utilisent pas de pool non paginé et n'affectent pas la limite de pages verrouillées (une autre ressource potentiellement limitée qui pourrait vous empêcher avoir beaucoup de connexions de socket ouvertes).

En dehors de cela, vous aurez besoin de profiler, mais j'ai réussi à obtenir plus de 70 000 connexions simultanées sur un serveur modeste (mémoire de 760 Mo); voir ici http://www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html pour plus de détails.

Évidemment, si vous utilisez une architecture moins efficace, telle que "thread par connexion" ou "select", vous devriez vous attendre à des résultats moins impressionnants. mais, à mon humble avis, il n’ya tout simplement aucune raison de choisir de telles architectures pour les serveurs Windows Sockets.

Edit: voir ici http://blogs.technet.com/markrussinovich/archive/2009/03 /26/3211216.aspx ; la manière dont le montant du pool non paginé est calculé a changé dans Vista et Server 2008 et il y a maintenant beaucoup plus disponible.

1
Len Holgate