Включить Massive Concurrent SSH на один сервер

9

Моя цель - разрешить запуск 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

Я сделал следующие модификации:

  1. В /etc/security/limits.confи /etc/security/limits.d/90-nproc.confустановите soft & hard nofile& nprocна 65535 (это максимально возможное значение, верно? - Обновление: нет. Максимальное значение 1048576 )
  2. В /etc/sysctl.conf, установитьkernel.pty.max = 65535
  3. В /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

Я застрял на этом довольно долго.
Любая помощь будет высоко ценится!

Клара
источник
1
Журнал сервера sshd может предоставить больше информации о причине отклонения соединений. В основном, если вы хотите всего 10000 сеансов, я бы порекомендовал вам использовать мультиплексирование с использованием ControlMaster (и, конечно, поднять MaxSessions).
Jakuje
1
Я не думаю, что sleep 100sделает то, что вы думаете. Он выполняется не в сеансе ssh, а на вашей собственной машине.
Даниэль Куллманн
1
@Jakuje спасибо, что напомнили мне проверить журнал сервера! Я обнаружил error: reexec socketpair: Too many open files, поэтому я предполагаю, что предыдущее значение nofile(т.е. 65535) было далеко не достаточно. Я не знаком с ControlMaster, но попробую, спасибо !! :)
Клара
1
Интересно, что когда я выполняю одну из строк, появляется ps axu | egrep "ssh|sleep" | grep -v grepтолько список sleep 100s, а не ssh. Я думаю, что вы должны изменить команду на ssh "echo hi; sleep 100s".
Даниэль Куллманн
2
@danielkullmann Да, вы абсолютно правы - sleep 100должно быть в команде, отправленной через ssh, как в моем реальном скрипте, но я здесь сделал опечатку. Я обновил основной пост соответственно. Большое вам спасибо за указание на это !!
Клара

Ответы:

2

/ мне жаль, что он не мог комментировать

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.

Hvisage
источник