web-dev-qa-db-fra.com

Combien de connexions de socket un serveur Web peut-il gérer?

Supposons que si je souhaite un hébergement partagé, virtuel ou dédié, je lis quelque part un serveur/une machine ne peut gérer que 64 000 connexions TCP à la fois, est-ce vrai? Combien de personnes un type d'hébergement peut-il gérer indépendamment de la bande passante? Je suppose que HTTP fonctionne sur TCP.

Est-ce que cela signifierait que seulement 64 000 utilisateurs pourraient se connecter au site Web, et si je voulais en servir plus, je devrais passer à une ferme Web?

89
David

En bref: Vous devriez pouvoir réaliser dans l’ordre des millions de connexions actives simultanées TCP et par extension une ou plusieurs requêtes HTTP. 

Aujourd'hui, je me demandais si IIS avec ASP.NET prendrait en charge une centaine de connexions simultanées. Quand j'ai vu cette question/réponses, je ne pouvais pas m'empêcher de répondre moi-même, beaucoup de réponses à la question ici sont complètement incorrectes.

Meilleur cas

La réponse à cette question ne doit concerner que la configuration de serveur la plus simple à découpler des innombrables variables et configurations possibles en aval.

Alors considérez le scénario suivant pour ma réponse:

  1. Pas de trafic sur les sessions TCP, à l'exception des paquets persistants (sinon vous auriez évidemment besoin d'une quantité correspondante de bande passante réseau et d'autres ressources informatiques)
  2. Logiciel conçu pour utiliser des sockets et une programmation asynchrones plutôt qu'un thread matériel par requête d'un pool. (c'est-à-dire IIS, Node.js, Nginx ... serveur Web [mais pas Apache] avec un logiciel d'application conçu de manière asynchrone) 
  3. Bonne performance/dollar CPU/RAM. Aujourd'hui, arbitrairement, disons i7 (4 coeurs) avec 8 Go de RAM.
  4. Un bon pare-feu/routeur à assortir.
  5. Pas de limite virtuelle/gouverneur - c'est à dire. Linux somaxconn, IIS web.config ...
  6. Pas de dépendance vis-à-vis d'autres matériels plus lents - pas de lecture sur le disque dur, car il s'agirait du plus petit dénominateur commun et du goulot d'étranglement, et non des E/S réseau.

Réponse détaillée

Les conceptions liées à des threads synchrones tendent à être les moins performantes par rapport aux implémentations asynchrones IO. 

WhatsApp reçoit un million de personnes avec du trafic sur une seule machine OS Unix - https://blog.whatsapp.com/index.php/2012/01/1-million-is-so-2011/ .

Et enfin, celui-ci, http://highscalability.com/blog/2013/5/13/the-secret-to-10-million-concurrent-connections-the-kernel-i.html , entre en beaucoup de détails, explorant comment même 10 millions pourraient être atteints. Les serveurs ont souvent des moteurs de déchargement TCP matériels, des ASIC conçus pour ce rôle spécifique de manière plus efficace qu'un processeur à usage général.

Bons choix de conception de logiciel

La conception IO asynchrone diffère selon les systèmes d'exploitation et les plates-formes de programmation. Node.js a été conçu avec asynchrone à l'esprit. Vous devez au moins utiliser Promises, et lorsque ECMAScript 7 arrive, asyncawait. C # /. Net a déjà un support complet asynchrone comme node.js. Quels que soient le système d'exploitation et la plate-forme, les performances asynchrones doivent être très performantes. Et quelle que soit la langue que vous choisissiez, recherchez le mot clé "asynchrone", la plupart des langues modernes seront prises en charge, même s'il s'agit d'une extension.

_/À WebFarm?

Quelle que soit la limite définie pour votre situation particulière, oui, une batterie de serveurs Web est une bonne solution pour la mise à l'échelle. Il existe de nombreuses architectures pour y parvenir. On utilise un équilibreur de charge (les hébergeurs peuvent les proposer, mais même ceux-ci ont une limite, ainsi que le plafond de bande passante), mais je ne privilégie pas cette option. Pour les applications à une seule page avec des connexions de longue durée, je préfère plutôt avoir une liste ouverte de serveurs parmi lesquels l'application client choisira de manière aléatoire au démarrage et sera réutilisée pendant la durée de vie de l'application. Cela supprime le point de défaillance unique (équilibreur de charge) et permet la mise à l'échelle à travers plusieurs centres de données et donc beaucoup plus de bande passante.

Briser un mythe - Ports 64K

S'agissant de la question "64 000", il s'agit d'une idée fausse. Un serveur peut se connecter à plus de 65 535 clients. Voir https://networkengineering.stackexchange.com/questions/48283/is-a-tcp-server-limited-to-65535-clients/48284

À propos, Http.sys sous Windows permet à plusieurs applications de partager le même port de serveur sous le schéma d'URL HTTP. Ils enregistrent chacun une liaison de domaine distincte, mais il existe finalement une application serveur unique qui envoie les demandes aux applications appropriées.

83
Todd

Cette question est assez difficile. Il n'y a pas de réelle limitation logicielle du nombre de connexions actives qu'une machine peut avoir, bien que certains systèmes d'exploitation soient plus limités que d'autres. Le problème devient celui des ressources. Par exemple, supposons qu'une seule machine veuille gérer 64 000 connexions simultanées. Si le serveur utilise 1 Mo de RAM par connexion, il vous faudra 64 Go de RAM. Si chaque client doit lire un fichier, la charge d'accès au disque ou à la matrice de stockage devient beaucoup plus importante que ce que ces périphériques peuvent gérer. Si un serveur doit créer un processus par connexion, le système d'exploitation consacrera la majeure partie de son temps à la commutation du contexte ou à la privation des processus pour le temps processeur.

Le problème C10K page traite très bien de cette question.

52

Il semble que la réponse soit au moins 12 millions si vous avez un serveur costaud, votre logiciel de serveur est optimisé pour cela, vous avez assez de clients. Si vous testez un client sur un serveur, le nombre de numéros de port sur le client sera l’une des limites évidentes des ressources (chaque connexion TCP est définie par la combinaison unique d’IP et de numéro de port à la source et à la destination. ). 

(Vous devez exécuter plusieurs clients, sinon vous atteignez d'abord la limite de 64 Ko sur les numéros de port)

Au fond, c’est un exemple classique du discours selon lequel "la différence entre la théorie et la pratique est beaucoup plus grande dans la pratique que dans la théorie" - en pratique, atteindre les nombres les plus élevés semble être un cycle de a. proposer des modifications spécifiques de configuration/architecture/code, b. testez-le jusqu'à atteindre une limite, c. Ai-je fini? Si non, alors d. déterminer quel était le facteur limitant, e. retournez à l'étape a (rincez et répétez).

Voici un exemple avec 2 millions TCP de connexions sur une boîte robuste (128 Go RAM et 40 cœurs) exécutant Phoenix http://www.phoenixframework.org/blog/the-road-to- 2 millions de connexions Websocket - ils ont finalement eu besoin d’une cinquantaine de serveurs raisonnablement importants uniquement pour fournir la charge client (leurs plus petits clients initiaux ont été maximisés au début, par exemple, "notre capacité maximale est de 4core/15gb @ 450k clients").

Voici une autre référence pour aller cette fois à 10 millions: http://goroutines.com/10m .

Cela semble être basé sur Java et 12 millions de connexions: https://mrotaru.wordpress.com/2013/06/20/12-million-concurrent-connections-with-migratorydata-websocket-server/

6
iheggie

Pour ajouter mes deux cents à la conversation, un processus peut ouvrir simultanément un nombre de sockets connectés égal à ce nombre (dans les systèmes de type Linux)/proc/sys/net/core/somaxconn

cat/proc/sys/net/core/somaxconn

Ce numéro peut être modifié à la volée (uniquement par l'utilisateur root bien sûr)

echo 1024>/proc/sys/net/core/somaxconn

Mais cela dépend entièrement du processus du serveur, du matériel de la machine et du réseau, du nombre réel de sockets pouvant être connectés avant de planter le système.

6
Abraham Covelo

Notez que HTTP ne maintient généralement pas les connexions TCP ouvertes plus longtemps que la transmission de la page au client. et la lecture d'une page Web prend généralement beaucoup plus de temps que le téléchargement de la page ... pendant que l'utilisateur visualise la page, il n'ajoute aucune charge au serveur.

Ainsi, le nombre de personnes pouvant consulter simultanément votre site Web est beaucoup plus grand que le nombre de connexions TCP qu'il peut servir simultanément.

4
Jeremy Friesner

dans le cas du protocole IPv4, le serveur avec une adresse IP qui n'écoute que sur un port ne peut gérer que 2 ^ 32 adresses IP x 2 ^ 16 ports, soit 2 ^ 48 sockets uniques. Si vous parlez de serveur en tant que machine physique et que vous pouvez utiliser tous les 2 ^ 16 ports, le nombre maximal de sockets TCP/IP uniques pour une adresse IP peut être de 2 ^ 48 x 2 ^ 16 = 2 ^ 64. Veuillez noter que certains ports sont réservés au système d'exploitation, ce nombre sera donc inférieur. Pour résumer:

1 IP et 1 port -> 2 ^ 48 prises

1 IP et tous les ports -> 2 ^ 64 sockets

tous les sockets IPv4 uniques dans l'univers -> 2 ^ 96 sockets

1
Lukasz Ochmanski

Je pense que le nombre de connexions de socket simultanées qu'un serveur Web peut gérer dépend en grande partie de la quantité de ressources que chaque connexion consomme et de la quantité de ressources totale disponible sur le serveur, à l'exclusion de toute autre configuration limitant les ressources du serveur Web. 

Par exemple, si chaque connexion de socket consomme 1 Mo de ressource serveur et que le serveur dispose de 16 Go de RAM disponibles (théoriquement), cela signifierait qu'il ne pourrait gérer que des connexions simultanées (16 Go/1 Mo). Je pense que c'est aussi simple que ça ... VRAIMENT! 

Ainsi, quelle que soit la manière dont le serveur Web gère les connexions, chaque connexion consommera en définitive des ressources.

0
Oladipo Olasemo

Il y a deux discussions différentes ici: la première concerne le nombre de personnes pouvant se connecter à votre serveur. Celui-ci a reçu des réponses adéquates de la part d'autres personnes, je ne vais donc pas en parler.

Autre, combien de ports votre serveur peut-il écouter? Je crois que c'est de là que vient le chiffre de 64K. En réalité, le protocole TCP utilise un identifiant de 16 bits pour un port, qui correspond à 65536 (un peu plus de 64 Ko). Cela signifie que vous pouvez avoir autant d’écouteurs différents sur le serveur par adresse IP.

0
tunafish24