Mi objetivo es permitir que 10000 ssh simultáneos se ejecuten en un solo servidor.
Por simplicidad, le estoy diciendo a localhost:
for i in `seq 1 10000`; do
ssh localhost "echo ${i}; sleep 100" >>./info 2>>./log &
done
sleep 100es asegurarse de que cuando se inicie el ssh número 10000, el primer ssh todavía esté conectado, de modo que haya 10000 ssh simultáneos .
Y aquí están los dos tipos de mensajes de error que recibí:
1. ssh_exchange_identification: Connection closed by remote host
2. ssh_exchange_identification: read: Connection reset by peer
He hecho las siguientes modificaciones:
- En
/etc/security/limits.confy/etc/security/limits.d/90-nproc.conf, establezca soft & hardnofile&nprocen 65535 (este es el valor máximo posible, ¿verdad? - Actualización: no. El valor máximo es 1048576 ) - En
/etc/sysctl.conf, establecerkernel.pty.max = 65535 - En
/etc/ssh/sshd_config, conjuntoMaxStartups 10000.
Estas modificaciones me permiten ejecutar con éxito 1000 ssh simultáneos en un solo servidor, pero no funcionan para 2000 y superiores ssh s.
Algunas personas han sugerido cambiar el valor de MaxSessions(en realidad no estoy claro acerca de su uso: ¿cómo afecta la multiplexación a mi caso?), /proc/sys/net/core/netdev_max_backlogY /proc/sys/net/core/somaxconn, pero parecen no hacer ninguna diferencia.
Además, no hay ningún error si son 10000 ssh simultáneos a diferentes servidores (los problemas ocurren solo cuando ssh a un solo servidor):
for i in `seq 1 10000`; do
j=$(( 1 + $i % 8 ))
ssh server-${j} "echo hi; sleep 100" >info-${j} 2>log-${j} &
done
He estado atrapado en esto por bastante tiempo.
¡Cualquier ayuda sería muy apreciada!

sleep 100shaga lo que tú piensas. Se ejecuta no en la sesión ssh, sino en su propia máquina.error: reexec socketpair: Too many open files, así que supongo que el valor anterior denofile(es decir, 65535) estaba lejos de ser suficiente. No estoy familiarizado con ControlMaster pero lo intentaré, ¡gracias! :)ps axu | egrep "ssh|sleep" | grep -v grepsolo enumera elsleep 100s, no elssh. Creo que deberías cambiar el comando assh "echo hi; sleep 100s".sleep 100debe estar en el comando enviado a través de ssh, que es el caso en mi script real, pero hice un error tipográfico aquí. He actualizado la publicación principal en consecuencia. ¡Muchas gracias por señalarlo!Respuestas:
/ ojalá pudiera comentar
sshd necesita (normalmente, pero aunque no especificó los casos de uso exactos, etc.) asignar una pty por inicio de sesión, sin embargo, en su caso, ssh "echo hi; sleep 100s" NO asigna una pty, por lo que no necesita la configuración kernel.pty.max ... a menos que desee que miles de usuarios hayan iniciado sesión * ... para probar eso, deberá agregar la opción -t a sus pruebas, es decir. ssh -t "echo hola; duerme 100s"
Volviendo al tema en cuestión con las
error: reexec socketpair: Too many open filesPruebas en un Wheezy dist-actualizado al sistema Jessie, descubrí que / etc / security / limit * no cambia los límites del sshd.compruebe eso con lo
cat /proc/<pid-of-sshd>/limitsque en mi caso, después de configurar /etc/security/limits.conf: * nofile soft 65535 * nofile hard 65535 todavía informa solo 1024 (soft) y 4096 (hard) para los límites de sshd. La resolución parece ser forzar elulimit -Hn 65535&ulimit -n 65535dentro del/etc/init.d/sshscript usando los comandos ulimit, he elevado los nofiles del sshd a 65535/65535 desde 1024/4096fuente