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é en charge de tester un serveur Apache avec ab qu'il est assez facile à emboiter 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 elles pour des 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
la source
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:
la source
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. Donc, ceci et la prochaine section de ce lien pourraient être ce que vous recherchez.
la source
Essayez également de définir tcp_fin_timeout. Cela devrait fermer TIME_WAIT plus rapidement.
la source
tcp_tw_recycle
que c'est potentiellement dangereux.tcp_tw_reuse
est plus sûr et je ne vois aucune raison de les utiliser simultanément.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 autoriser 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.
la source
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.
la source
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.
la source
L'outil d'analyse comparative du serveur HTTP Apache, ab , dans la version 2.4 a le délai d' attente -s option. Voir aussi ab (Apache Bench) error: apr_poll: le délai d'attente spécifié a expiré (70007) sous Windows .
Cette option résout votre problème.
la source