En augmentant le nombre maximum de connexions tcp/ip sous linux
Je suis de la programmation d'un serveur et il semble que mon nombre de connexions est limité étant donné que ma bande passante n'est pas saturé, même quand j'ai mis le nombre de connexions à "illimité".
Comment puis-je augmenter ou éliminer un nombre maximum de connexions que mon Ubuntu Linux boîte peut ouvrir à un moment? L'OS de la limite de cette, ou est-ce que le routeur ou le fournisseur d'accès internet? Ou est-ce autre chose?
- Singe: j'ai répondu à cela de toute façon, parce que j'espère que cela peut être utile pour quelqu'un qui est réellement écrit un serveur dans le futur.
- J'ai vu qu' +1. En fait, j'ai eu la même réflexion après mon commentaire précédent, mais pensé que je laisserais le commentaire stand.
Vous devez vous connecter pour publier un commentaire.
Nombre Maximum de connexions sont touchés par certaines limites sur les deux client & serveur côtés, mais un peu différemment.
Sur le côté client:
Augmentation de la ephermal plage de ports, et de diminuer la
tcp_fin_timeout
Pour trouver les valeurs par défaut:
La ephermal plage de port définit le nombre maximal de sortants sockets un hôte peut créer à partir d'une I. P. de l'adresse. Le
fin_timeout
définit le temps minimum ces prises resteront dansTIME_WAIT
état (inutilisable après avoir utilisé une fois).D'habitude les valeurs par défaut sont:
net.ipv4.ip_local_port_range = 32768 61000
net.ipv4.tcp_fin_timeout = 60
Cela signifie essentiellement que votre système ne peut pas systématiquement garantie de plus de
(61000 - 32768) /60 = 470
sockets par seconde. Si vous n'êtes pas heureux avec cela, vous pouvez commencer avec l'augmentation de laport_range
. Le réglage de la portée de15000 61000
est assez fréquent de nos jours. Vous pourraient encore augmenter la disponibilité par la diminution de lafin_timeout
. Supposons que vous faites les deux, vous devriez voir plus de 1500 connexions sortantes par seconde, plus facilement.Pour modifier les valeurs:
Le ci-dessus ne doivent pas être interprétés comme des facteurs influant sur la capacité de système pour faire les connexions sortantes par seconde. Mais plutôt ces facteurs influent sur la capacité du système à gérer connexions simultanées d'une manière durable pour les grandes périodes de "activité".
Par défaut Sysctl valeurs typiquement sur une Linux box pour
tcp_tw_recycle
&tcp_tw_reuse
seraitElles ne permettent pas une connexion à partir d'un "utilisé" socket (en attente) et la force de la sockets pour tenir toute la
time_wait
cycle. Je vous recommande de créer:Cela permet rapidement de cyclisme de sockets dans
time_wait
de l'état et de réutilisation. Mais avant de faire ce changement, assurez-vous que ce n'est pas en conflit avec les protocoles que vous utilisez pour l'application qui a besoin de ces supports. Assurez-vous de lire le post "Face à la TCP TEMPS d'ATTENTE" de Vincent Bernat de comprendre les implications. Lenet.ipv4.tcp_tw_recycle
option est tout à fait problématique pour le public face serveurs comme elle ne gère pas les connexions à partir de deux ordinateurs différents, derrière le même périphérique NAT, qui est un problème difficile à détecter et à l'attente de vous mordre. Notez quenet.ipv4.tcp_tw_recycle
a été supprimé de Linux 4.12.Sur le Côté Serveur:
Le
net.core.somaxconn
valeur a un rôle important. Il limite le nombre maximum de demandes en attente pour un socket d'écoute. Si vous êtes sûr de votre serveur de l'application de la capacité, de l'augmenter jusqu'par défaut de 128 à quelque chose comme de 128 à 1024. Maintenant, vous pouvez profiter de cette augmentation par la modification de l'écoute de l'arriéré de la variable dans votre application écouter appel, à un égal ou supérieur entier.txqueuelen
paramètre de votre carte ethernet ont également un rôle à jouer. Les valeurs par défaut sont de 1000, afin de remonter jusqu'à 5000 ou même plus si votre système le permet.De même remonter les valeurs pour
net.core.netdev_max_backlog
etnet.ipv4.tcp_max_syn_backlog
. Leurs valeurs par défaut sont 1000 et 1 024 respectivement.Maintenant, n'oubliez pas de commencer à la fois de votre côté client et serveur d'applications par l'augmentation de la FD ulimts, dans la coquille.
Outre l'un des plus populaires de la technique utilisée par les programmeurs est de réduire le nombre de tcp écrire appels. Ma préférence est d'utiliser un tampon dans lequel j'ai pousser les données que j'ai à envoyer au client, puis à des moments appropriés, j'écris sur les données mises en mémoire tampon dans le socket. Cette technique me permet d'utiliser de grands paquets de données, la réduction de la fragmentation réduit mon utilisation de l'UC à la fois dans l'espace utilisateur et au niveau du noyau.
(61000 - 32768) / 60 = 470 sockets per second
. Pouvez-vous préciser cela?Il ya un couple de variables pour définir le nombre maximal de connexions. Très probablement, vous êtes à court de fichier de nombres premiers. Vérifier ulimit-n. Après cela, il y a des paramètres dans /proc, mais ceux par défaut pour les dizaines de milliers de personnes.
Plus important encore, il semble que vous êtes en train de faire quelque chose de mal. Une seule connexion TCP doit être en mesure d'utiliser la totalité de la bande passante entre les deux parties; si elle n'est pas:
ping -s 1472
...)tc
iperf
J'ai peut-être mal compris. Peut-être que vous êtes en train de faire quelque chose, comme Bittorrent, où vous avez besoin de beaucoup de connexions. Si oui, vous devez trouver le nombre de connexions que vous utilisez réellement (essayez
netstat
oulsof
). Si ce nombre est important, vous pourriez:ulimit -n
. Encore, ~1000 connexions (par défaut sur mon système) est tout à fait un peu.iostat -x
?Aussi, si vous utilisez un consommateur-grade NAT du routeur (Linksys, Netgear, DLink, etc.), attention, vous risquez de dépasser ses capacités avec des milliers de connexions.
J'espère que cela donne un peu d'aide. Vous êtes vraiment demander de réseautage question.
Pour améliorer la réponse donnée par derobert,
Vous pouvez déterminer ce que votre OS limite de connexion est par cat nf_conntrack_max.
Par exemple:
cat /proc/sys/net/netfilter/nf_conntrack_max
Vous pouvez utiliser le script suivant pour compter le nombre de connexions tcp à une plage de ports tcp. Par défaut 1 et 65535.
Cela permettra de confirmer si oui ou non vous êtes plafonnait votre système d'exploitation limite de connexion.
Voici le script.
which awk
est votre ami pour déterminer le chemin d'accès à awk, SunOS a un lien en plus 🙂PATH
dans ce cas, vous pouvez simplement utiliserawk
au lieu de fournir un chemin d'accès complet. (cela dit, je ne suis pas sûr si la solution du script est plus près de la perfection, mais ce n'est pas ce que le script est sur).awk
emplacement, mais suppose que la coquille est toujours/bin/bash
(conseil du pro: AIX5/6 n'ont même pas de bash par défaut).awk
de détection utile? Personnellement, je voudrais simplement assumer d'avoir une bonnePATH
mais une alternative raisonnable pourrait être/usr/bin/env awk
et/usr/bin/env bash
respectivement. Pour ce que ça vaut, il a obtenu l'emplacement de mal sur mon système Linux. C'est dans/usr/bin/awk
pas/bin/awk
Au niveau de l'application, voici quelque chose d'un développeur peut faire:
Depuis le côté serveur:
Vérifier si l'équilibrage de charge(si vous avez),fonctionne correctement.
Tour lent délais d'attente TCP en 503 Rapide réponse Immédiate, si vous équilibreur de charge fonctionne correctement, il devrait choisir la travail de ressources pour servir, et c'est mieux que de trainer là avec une erreur inattendue des massages.
Par exemple: Si vous utilisez le nœud de serveur, u peut utiliser toobusy de mnp.
La mise en œuvre quelque chose comme:
Pourquoi 503? Voici quelques bonnes idées pour la surcharge:
http://ferd.ca/queues-don-t-fix-overload.html
Nous pouvons faire un peu de travail à côté client trop:
Essayer d'appels de groupe dans le lot, de réduire le trafic et le nombre total de demandes nombre de b/w le client et le serveur.
Essayer de construire un cache couche intermédiaire pour gérer les doubles inutiles demandes.