Question Qu'est-ce qui limite le nombre maximal de connexions sur un serveur Linux?


Quel paramètre de noyau ou autres paramètres contrôlent le nombre maximal de sockets TCP pouvant être ouverts sur un serveur Linux? Quels sont les compromis de permettre plus de connexions?

J'ai remarqué lors du chargement d'un serveur Apache avec un B qu'il est assez facile de maximiser les connexions ouvertes sur le serveur. Si vous laissez l'option -k de ab, qui permet la réutilisation de la connexion et que celui-ci envoie plus de 10 000 demandes environ, Apache traite les 11 000 premières demandes environ, puis s'arrête pendant 60 secondes. Un aperçu de la sortie netstat montre 11 000 connexions dans l'état TIME_WAIT. Apparemment, c'est normal. Les connexions sont maintenues ouvertes par défaut pendant 60 secondes même après que le client en a terminé avec Raisons de fiabilité TCP.

Il semble que ce serait un moyen facile de créer un serveur et je me demande quels sont les réglages et les précautions habituels.

Voici ma sortie de test:

# ab -c 5 -n 50000 http://localhost/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 5000 requests
Completed 10000 requests
apr_poll: The timeout specified has expired (70007)
Total of 11655 requests completed

Voici la commande netstat que j'ai exécutée pendant le test:

 # netstat --inet -p | grep "localhost:www" | sed -e 's/ \+/ /g' | cut -d' ' -f 1-4,6-7 | sort | uniq -c 
  11651 tcp 0 0 localhost:www TIME_WAIT -
      1 tcp 0 1 localhost:44423 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44424 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44425 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44426 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44428 SYN_SENT 7831/ab

85
2018-05-21 16:18


origine




Réponses:


J'ai finalement trouvé le réglage qui limitait vraiment le nombre de connexions: net.ipv4.netfilter.ip_conntrack_max. Cette valeur a été définie sur 11 776 et le nombre de demandes que je peux répondre à mon test est le nombre de demandes que je peux exécuter avant de devoir attendre. tcp_fin_timeout secondes pour que plus de connexions deviennent disponibles. le conntrack table est ce que le noyau utilise pour suivre l’état des connexions. Une fois qu’il est complet, le noyau commence à déposer des paquets et à l’afficher dans le journal:

Jun  2 20:39:14 XXXX-XXX kernel: ip_conntrack: table full, dropping packet.

La prochaine étape consistait à amener le noyau à recycler toutes ces connexions dans le TIME_WAIT Etat plutôt que de laisser tomber des paquets. Je pourrais obtenir que cela se produise en allumant tcp_tw_recycle ou en augmentation ip_conntrack_max être plus grand que le nombre de ports locaux mis à disposition pour les connexions par ip_local_port_range. Je suppose qu'une fois que le noyau est sorti des ports locaux, il commence à recycler les connexions. Cela utilise plus de connexions de suivi de la mémoire, mais il semble que la meilleure solution que d'allumer tcp_tw_recycle puisque les documents impliquent que cela est dangereux.

Avec cette configuration, je peux exécuter un ab toute la journée et ne jamais manquer de connexions:

net.ipv4.netfilter.ip_conntrack_max = 32768
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_fin_timeout = 25
net.ipv4.tcp_max_orphans = 8192
net.ipv4.ip_local_port_range = 32768    61000

le tcp_max_orphans le réglage n'a eu aucun effet sur mes tests et je ne sais pas pourquoi. Je penserais que cela fermerait les connexions dans TIME_WAIT état une fois il y avait 8192 d'entre eux, mais il ne fait pas ça pour moi.


62
2018-06-03 16:02



Où configurons-nous ces paramètres? - Codevalley
@ Codevalley Cela peut dépendre du système mais sur Ubuntu Server, ils vont dans /etc/sysctl.conf - Ben Williams


Vous voulez vraiment regarder ce que le système de fichiers / proc a à vous offrir à cet égard.

Sur cette dernière page, les éléments suivants pourraient vous intéresser:

  • / proc / sys / net / ipv4 / tcp_max_orphans, qui contrôle le nombre maximum de prises détenues par le système ne pas attaché à quelque chose. L'augmentation de cette quantité peut consommer jusqu'à 64 Ko de mémoire non échangeable. par prise orpheline.
  • / proc / sys / net / ipv4 / tcp_orphan_retries, qui contrôle le nombre de tentatives avant qu'un socket ne soit orphelin et fermé. Il y a une note spécifique sur cette page à propos des serveurs Web qui vous intéresse directement ...

23
2018-05-21 18:15



tcp_max_orphans est intéressant, mais il semble que cela ne fonctionne pas. Lorsque j'essaie de mesurer les sockets orphelins au cours de mon test, j'en vois 11 651 tandis que tcp_max_orphans vaut 8 092. # netstat --inet -p | grep "localhost: www" | sed -e 's / \ + / / g' | cut -d '' -f 1-4,6-7 | trier | uniq -c 11651 tcp 0 0 localhost: www TIME_WAIT - - Ben Williams
Regardez le paramètre tcp_orphan_retries - l’idée étant que les sockets sont "éliminées" plus rapidement ... - Avery Payne
La suggestion de @Jauder Ho + tcp_orphan_retries semble être une victoire potentielle pour votre situation. - Avery Payne


Je ne pense pas qu'il soit possible de régler cela directement. Cela entre dans la catégorie du réglage TCP / IP. Pour savoir ce que vous pouvez accorder, essayez «man 7 tcp». Le sysctl ('man 8 sysctl') est utilisé pour les définir. 'sysctl -a | grep tcp 'va vous montrer la plupart de ce que vous pouvez accorder, mais je ne suis pas sûr que cela les montre toutes. De plus, à moins que cela ne change, les sockets TCP / IP ouverts ressemblent à des descripteurs de fichier. Alors ce et la section suivante de ce lien pourrait correspondre à ce que vous recherchez.


3
2018-05-21 17:31





Essayez également de définir tcp_fin_timeout. Cela devrait fermer TIME_WAIT plus rapidement.

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

2
2018-05-21 19:38



Attention ici! Expérimenté à la dure. "Cela peut provoquer des chutes de trames avec équilibrage de charge et NAT, utilisez-le uniquement pour un serveur qui communique uniquement via votre réseau local." - wiki.archlinux.org/index.php/Sysctl - Henk
@ Henk je suppose que c'est tcp_tw_recycle c'est potentiellement dangereux. tcp_tw_reuse est plus sûr et je ne vois aucune raison de les utiliser simultanément. - Vladislav Rastrusny


Le stock apache (1) était auparavant prédéfini pour ne prendre en charge que 250 connexions simultanées. Si vous en vouliez plus, il y avait un fichier d'en-tête à modifier pour permettre plusieurs sessions simultanées. Je ne sais pas si cela est toujours vrai avec Apache 2.

En outre, vous devez ajouter une option permettant d'autoriser le chargement de davantage de descripteurs de fichiers ouverts pour le compte qui exécute Apache, ce que les commentaires précédents ne peuvent pas signaler.

Faites attention aux paramètres de votre opérateur et aux types de délais keepalive que vous avez dans Apache lui-même, au nombre de serveurs de secours en cours d'exécution à la fois et à la vitesse à laquelle ces processus supplémentaires sont supprimés.


2
2018-05-21 21:21





Vous pouvez réduire le temps passé dans l'état TIME_WAIT (Définissez net.ipv4.tcp_fin_timeout). Vous pouvez remplacer Apache par YAWS ou nginx ou quelque chose de similaire.

Les échanges de davantage de connexions impliquent généralement une utilisation de la mémoire et, si vous avez un processus de forking, de nombreux processus enfants surchargent votre processeur.


1
2018-05-21 16:26



tcp_fin_timeout ne sert pas à définir l’expiration de TIME-WAIT, qui ne peut pas être changée en dehors de la reconstruction du noyau, mais à FIN, comme son nom l’indique. - Alexandr Kurilin


Le nombre absolu de sockets pouvant être ouverts sur une seule adresse IP est de 2 ^ 16 et est défini par TCP / UDP, et non par le noyau.


0
2018-05-30 16:42



Non ce n'est pas. Vous pouvez en ouvrir davantage, car le port local n'a pas besoin d'être unique tant que les adresses distantes sont différentes. De plus, l'OP dit par serveur, et vous pouvez avoir> 1 adresse par serveur. - MarkR


L'outil d'analyse comparative du serveur HTTP Apache, un B, dans la version 2.4 a la -s timeout option. Voir également erreur ab (Apache Bench): apr_poll: le délai d'attente spécifié a expiré (70007) sous Windows.

Cette option résout votre problème.


0
2018-02-08 17:56