Моя цель - разрешить запуск 10000 одновременных SSH на одном сервере.
Для простоты я обращаюсь к локальному хосту:
for i in `seq 1 10000`; do
ssh localhost "echo ${i}; sleep 100" >>./info 2>>./log &
done
sleep 100
чтобы убедиться, что при запуске 10000-го ssh 1-й ssh все еще подключен, поэтому действительно существует 10000 одновременных ssh .
И вот два типа сообщений об ошибках, которые я получил:
1. ssh_exchange_identification: Connection closed by remote host
2. ssh_exchange_identification: read: Connection reset by peer
Я сделал следующие модификации:
- В
/etc/security/limits.conf
и/etc/security/limits.d/90-nproc.conf
установите soft & hardnofile
&nproc
на 65535 (это максимально возможное значение, верно? - Обновление: нет. Максимальное значение 1048576 ) - В
/etc/sysctl.conf
, установитьkernel.pty.max = 65535
- В
/etc/ssh/sshd_config
, установитьMaxStartups 10000
.
Эти модификации позволяют мне успешно запускать 1000 одновременных SSH на одном сервере, но они не работают для 2000 и выше SSH .
Некоторые люди предлагают изменить значение для MaxSessions
( на самом деле я не ясно , о его использовании: как это мультиплексирование влияет на мой случай), /proc/sys/net/core/netdev_max_backlog
и /proc/sys/net/core/somaxconn
, но они , кажется , не имеет никакого значения.
Кроме того, нет ошибки, если они являются 10000 одновременными ssh с разных серверов (проблемы возникают только при ssh на один сервер):
for i in `seq 1 10000`; do
j=$(( 1 + $i % 8 ))
ssh server-${j} "echo hi; sleep 100" >info-${j} 2>log-${j} &
done
Я застрял на этом довольно долго.
Любая помощь будет высоко ценится!
sleep 100s
делает то, что вы думаете. Он выполняется не в сеансе ssh, а на вашей собственной машине.
error: reexec socketpair: Too many open files
, поэтому я предполагаю, что предыдущее значение nofile
(т.е. 65535) было далеко не достаточно. Я не знаком с ControlMaster, но попробую, спасибо !! :)
ps axu | egrep "ssh|sleep" | grep -v grep
только список sleep 100s
, а не ssh
. Я думаю, что вы должны изменить команду на ssh "echo hi; sleep 100s"
.
sleep 100
должно быть в команде, отправленной через ssh, как в моем реальном скрипте, но я здесь сделал опечатку. Я обновил основной пост соответственно. Большое вам спасибо за указание на это !!