105 votes

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

Quel paramètre du noyau ou autres réglages contrôlent le nombre maximum de sockets TCP qui peuvent être ouverts sur un serveur Linux ? Quels sont les inconvénients de l'autorisation d'un plus grand nombre de connexions ?

J'ai remarqué en testant la charge d'un serveur Apache avec ab qu'il est assez facile de maximiser le nombre de connexions ouvertes sur le serveur. Si vous n'utilisez pas l'option -k d'ab, qui permet la réutilisation des connexions, et que vous lui demandez d'envoyer plus de 10 000 requêtes, Apache répond aux quelque 11 000 premières requêtes, puis s'arrête pendant 60 secondes. Un coup d'oeil à la sortie de 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 ait fini avec elles pour Raisons de la fiabilité du TCP .

Il semble que ce soit un moyen facile de détraquer un serveur et je me demande quels sont les réglages et les précautions habituels pour cela.

Voici le résultat de mon 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'exécute 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

1voto

Devdas Points 737

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

La contrepartie d'un plus grand nombre de connexions implique généralement l'utilisation de la mémoire et, si vous avez un processus de bifurcation, de nombreux processus enfants qui submergent votre CPU.

1 votes

Tcp_fin_timeout ne sert pas à définir l'expiration de TIME-WAIT, qui n'est pas modifiable en dehors de la reconstruction du noyau, mais pour FIN, comme son nom l'indique.

0voto

Brad Points 1004

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

7 votes

Non, ça ne l'est pas. Vous pouvez en ouvrir plus, 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.

0voto

Dzwiedziu-nkg Points 101

L'outil d'évaluation du serveur HTTP Apache, ab Dans la version 2.4, l'option -s timeout option. Voir aussi ab (Banc Apache) erreur : apr_poll : Le délai d'attente spécifié a expiré (70007) sous Windows. .

Cette option résout votre problème.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X