Увімкніть масивний одночасний SSH на одному сервері


9

Моя мета - дозволити 10000 одночасних ssh s працювати на одному сервері.

Для простоти я прихиляюсь до localhost:

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 s на одному сервері, але вони не працюють для 2000 і вище ssh s.

Деякі люди пропонують змінити значення для MaxSessions( на самом деле я не ясно , про його використанні: як це мультиплексування впливає на мій випадок), /proc/sys/net/core/netdev_max_backlogі /proc/sys/net/core/somaxconn, але вони , здається , не має ніякого значення.

Крім того, немає помилок, якщо вони одночасно 10000 ssh s на різних серверах (проблеми виникають лише при 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, а на власній машині.
daniel kullmann

1
@Jakuje дякую, що нагадав мені перевірити журнал сервера! Я знайшов error: reexec socketpair: Too many open files, тому я припускаю, що попереднє значення nofile(тобто 65535) було далеко не достатньо. Я не знайомий з ControlMaster, але спробую це, дякую !! :)
Клара

1
Цікаво, що коли я виконую один із рядків, a ps axu | egrep "ssh|sleep" | grep -v grepлише перелічує sleep 100s, а не the ssh. Я думаю, ви повинні змінити команду на ssh "echo hi; sleep 100s".
Даніель Куллманн

2
@danielkullmann Так, ви абсолютно праві - sleep 100повинні бути в команді, що надсилається через ssh, що є випадком у моєму фактичному сценарії, але я зробив друкарську помилку тут. Я відповідно оновив головну публікацію. Дуже дякую, що вказали на це !!
Клара

Відповіді:


2

/ мені хотілося, щоб він міг прокоментувати

sshd потрібно (як правило, але хоча ви не вказали точні випадки використання тощо), виділити pty за логін, однак у вашому випадку ssh "echo привіт; сон 100s" НЕ виділяє pty, так не потрібно налаштування kernel.pty.max ... якщо ви не хочете, щоб тисячі користувачів увійшли * *, щоб перевірити це, вам потрібно буде додати тест -t до своїх тестів, тобто. ssh -t "відлуння привіт; сон 100-х"

Повернувшись до проблеми, що стосується error: reexec socketpair: Too many open files тестів на Wheezy, перетвореному на систему Джессі, я виявив, що / 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використовуючи ці необмежені команди, я підняв нофіли sshd до 65535/65535 з 1024/4096

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.