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 denofile
(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 lesleep 100s
, pas lessh
. Je pense que vous devriez changer la commande enssh "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é !!Réponses:
/ je souhaitais pouvoir commenter
sshd doit (généralement, mais bien que vous n'ayez pas spécifié le ou les cas d'utilisation exacts, etc.) allouer un pty par connexion, cependant, dans votre cas, ssh "echo hi; sleep 100s" n'alloue PAS de pty, donc pas besoin du paramètre kernel.pty.max ... sauf si vous voulez que des milliers d'utilisateurs soient connectés * ... pour tester cela, vous devrez ajouter l'option -t à vos tests, ie. ssh -t "echo hi; sleep 100s"
Revenant au problème en cours avec les
error: reexec socketpair: Too many open files
tests sur un système Wheezy mis à niveau vers le système Jessie, j'ai trouvé que / etc / security / limit * ne change pas les limites du sshd.vérifiez ce avec
cat /proc/<pid-of-sshd>/limits
quoi dans mon cas, après avoir défini dans /etc/security/limits.conf: * nofile soft 65535 * nofile hard 65535 ne rapporte toujours que 1024 (soft) et 4096 (hard) pour les limites de sshd. La résolution semble être de forcer leulimit -Hn 65535
&ulimit -n 65535
à l'intérieur du/etc/init.d/ssh
script en utilisant les commandes ulimit, j'ai augmenté les nofiles de sshd à 65535/65535 de 1024/4096la source