Activer SSH simultané massif sur un seul serveur

9

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 100c'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:

  1. Dans /etc/security/limits.confet /etc/security/limits.d/90-nproc.conf, définissez soft & hard nofile& nprocsur 65535 (c'est la valeur maximale possible, n'est-ce pas? - Mise à jour: non. La valeur maximale est 1048576 )
  2. Dans /etc/sysctl.conf, définissezkernel.pty.max = 65535
  3. Dans /etc/ssh/sshd_config, réglez MaxStartups 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_backlogEt /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!

Clara
la source
1
Le journal du serveur sshd peut fournir plus d'informations sur la raison du rejet des connexions. Fondamentalement, si vous voulez seulement 10000 sessions, je vous recommanderais d'utiliser le multiplexage à l'aide de ControlMaster (puis, bien sûr, de bump MaxSessions).
Jakuje
1
Je ne pense pas que le sleep 100sfait ce que vous pensez. Il n'est pas exécuté dans la session ssh, mais sur votre propre machine.
daniel kullmann
1
@Jakuje merci de me rappeler de vérifier le journal du serveur! J'ai trouvé 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 !! :)
Clara
1
Intéressant, quand j'exécute une des lignes, a ps axu | egrep "ssh|sleep" | grep -v grepne fait que lister le sleep 100s, pas le ssh. Je pense que vous devriez changer la commande en ssh "echo hi; sleep 100s".
daniel kullmann
2
@danielkullmann Oui, vous avez absolument raison - sleep 100devrait ê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é !!
Clara

Réponses:

2

/ 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 le ulimit -Hn 65535& ulimit -n 65535à l'intérieur du /etc/init.d/sshscript en utilisant les commandes ulimit, j'ai augmenté les nofiles de sshd à 65535/65535 de 1024/4096

Hvisage
la source