Mon objectif est de permettre à 10000 ssh simultanés de s'exécuter sur un seul serveur.
Pour plus de simplicité, je suis en train de contacter localhost:
for i in `seq 1 10000`; do
ssh localhost "echo ${i}; sleep 100" >>./info 2>>./log &
done
sleep 100
c'est de s'assurer qu'au démarrage du 10000ème ssh, le 1er ssh est toujours en connexion donc il y a bien 10000 ssh simultanés .
Et voici les deux types de messages d'erreur que j'ai reçus:
1. ssh_exchange_identification: Connection closed by remote host
2. ssh_exchange_identification: read: Connection reset by peer
J'ai effectué les modifications suivantes:
- Dans
/etc/security/limits.conf
et/etc/security/limits.d/90-nproc.conf
, définissez soft & hardnofile
&nproc
sur 65535 (c'est la valeur maximale possible, n'est-ce pas? - Mise à jour: non. La valeur maximale est 1048576 ) - Dans
/etc/sysctl.conf
, définissezkernel.pty.max = 65535
- Dans
/etc/ssh/sshd_config
, réglezMaxStartups 10000
.
Ces modifications me permettent d'exécuter avec succès 1000 ssh simultanés sur un seul serveur, mais ils ne fonctionnent pas pour 2000 et au-dessus de ssh s.
Certaines personnes ont suggéré de changer la valeur de MaxSessions
(en fait, je ne suis pas clair sur son utilisation: comment le multiplexage affecte-t-il mon cas?), /proc/sys/net/core/netdev_max_backlog
Et /proc/sys/net/core/somaxconn
, mais cela ne semble pas faire de différence.
De plus, il n'y a pas d'erreur si ce sont 10000 ssh simultanés vers différents serveurs (les problèmes se produisent uniquement lorsque ssh vers un seul serveur):
for i in `seq 1 10000`; do
j=$(( 1 + $i % 8 ))
ssh server-${j} "echo hi; sleep 100" >info-${j} 2>log-${j} &
done
Je suis coincé là-dessus depuis assez longtemps.
Toute aide serait grandement appréciée!
sleep 100s
fait ce que vous pensez. Il n'est pas exécuté dans la session ssh, mais sur votre propre machine.
error: reexec socketpair: Too many open files
, donc je suppose que la valeur précédente de nofile
(ie 65535) était loin d'être suffisante. Je ne connais pas ControlMaster mais je vais l'essayer, merci !! :)
ps axu | egrep "ssh|sleep" | grep -v grep
ne fait que lister le sleep 100s
, pas le ssh
. Je pense que vous devriez changer la commande en ssh "echo hi; sleep 100s"
.
sleep 100
devrait être dans la commande envoyée via ssh, ce qui est le cas dans mon script actuel, mais j'ai fait une faute de frappe ici. J'ai mis à jour le message principal en conséquence. Merci beaucoup de l'avoir signalé !!