Моя цель - разрешить запуск 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, как в моем реальном скрипте, но я здесь сделал опечатку. Я обновил основной пост соответственно. Большое вам спасибо за указание на это !!Ответы:
/ мне жаль, что он не мог комментировать
sshd должен (как правило, но, хотя вы не указали точные варианты использования и т. д.) выделить pty для входа в систему, однако, в вашем случае, ssh "echo hi; sleep 100s" НЕ выделяет pty, поэтому нет необходимости в настройке kernel.pty.max ... если вы не хотите, чтобы тысячи пользователей вошли в систему * ... для проверки, вам нужно добавить опцию -t в ваши тесты, т.е. ssh -t "echo hi; sleep 100s"
Возвращаясь к проблеме,
error: reexec socketpair: Too many open files
связанной с тестами Wheezy, обновленными до системы Jessie, я обнаружил, что / etc / security / limit * не меняет пределы sshd.проверьте, с помощью
cat /proc/<pid-of-sshd>/limits
чего в моем случае после установки в /etc/security/limits.conf: * nofile soft 65535 * nofile hard 65535 по-прежнему сообщает только 1024 (soft) и 4096 (hard) для ограничений sshd. Похоже, что для разрешенияulimit -Hn 65535
&ulimit -n 65535
внутри/etc/init.d/ssh
скрипта используется команда ulimit, я поднял nofiles sshd до 65535/65535 с 1024/4096.источник