Il mio obiettivo è consentire a 10000 SSH simultanei in esecuzione su un singolo server.
Per semplicità sto scrivendo a localhost:
for i in `seq 1 10000`; do
ssh localhost "echo ${i}; sleep 100" >>./info 2>>./log &
done
sleep 100
è assicurarsi che quando inizia la 10000 ssh , la 1a ssh sia ancora connessa, quindi ci sono effettivamente 10000 ssh simultanee .
Ed ecco i due tipi di messaggi di errore che ho ricevuto:
1. ssh_exchange_identification: Connection closed by remote host
2. ssh_exchange_identification: read: Connection reset by peer
Ho apportato le seguenti modifiche:
- In
/etc/security/limits.conf
e/etc/security/limits.d/90-nproc.conf
, impostare soft & hardnofile
&nproc
su 65535 (questo è il valore massimo possibile giusto? - Aggiornamento: no. Il valore massimo è 1048576 ) - In
/etc/sysctl.conf
, setkernel.pty.max = 65535
- In
/etc/ssh/sshd_config
, setMaxStartups 10000
.
Queste modifiche mi permettono di eseguire correttamente 1000 concomitante ssh s per un singolo server, ma non lo fanno il lavoro per il 2000 e al di sopra ssh s.
Alcune persone hanno suggerito di cambiare il valore per MaxSessions
(in realtà non sono chiaro sul suo utilizzo: in che modo il multiplexing influisce sul mio caso?), /proc/sys/net/core/netdev_max_backlog
E /proc/sys/net/core/somaxconn
, ma sembrano non fare alcuna differenza.
Inoltre, non ci sono errori se sono 10000 SSH simultanei su server diversi (i problemi si verificano solo quando SSH su un singolo server):
for i in `seq 1 10000`; do
j=$(( 1 + $i % 8 ))
ssh server-${j} "echo hi; sleep 100" >info-${j} 2>log-${j} &
done
Sono stato bloccato su questo per molto tempo.
Ogni aiuto sarebbe profondamente apprezzato!
sleep 100s
che faccia quello che pensi. Viene eseguito non nella sessione ssh, ma sul tuo computer.
error: reexec socketpair: Too many open files
, quindi suppongo che il valore precedente di nofile
(cioè 65535) fosse tutt'altro che sufficiente. Non ho familiarità con ControlMaster ma ci proverò, grazie !! :)
ps axu | egrep "ssh|sleep" | grep -v grep
solo elenca il sleep 100s
, non il ssh
. Penso che dovresti cambiare il comando in ssh "echo hi; sleep 100s"
.
sleep 100
dovrebbe essere nel comando inviato tramite ssh, come nel mio vero script, ma ho fatto un refuso qui. Ho aggiornato il post principale di conseguenza. Grazie mille per averlo sottolineato !!