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 100
es 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.conf
y/etc/security/limits.d/90-nproc.conf
, establezca soft & hardnofile
&nproc
en 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_backlog
Y /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 100s
haga 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 de nofile
(es decir, 65535) estaba lejos de ser suficiente. No estoy familiarizado con ControlMaster pero lo intentaré, ¡gracias! :)
ps axu | egrep "ssh|sleep" | grep -v grep
solo enumera el sleep 100s
, no el ssh
. Creo que deberías cambiar el comando a ssh "echo hi; sleep 100s"
.
sleep 100
debe 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!