启用到单个服务器的大规模并发 SSH

Cla*_*ara 9 ssh sshd ulimit

我的目标是允许 10000 个并发ssh单个服务器上运行。

为简单起见,我使用 ssh 连接到本地主机:

for i in `seq 1 10000`; do
    ssh localhost "echo ${i}; sleep 100"  >>./info 2>>./log &
done
Run Code Online (Sandbox Code Playgroud)

sleep 100是为了确保当第 10000 个 ssh 开始时,第一个 ssh 仍在连接中,因此确实有 10000 个并发 ssh s。

这是我收到的两种错误消息:

1. ssh_exchange_identification: Connection closed by remote host

2. ssh_exchange_identification: read: Connection reset by peer
Run Code Online (Sandbox Code Playgroud)

我做了以下修改:

  1. /etc/security/limits.confand 中/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 s。

有些人建议更改 for MaxSessions(实际上我不清楚它的用法:多路复用如何影响我的情况?), /proc/sys/net/core/netdev_max_backlogand 的值/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
Run Code Online (Sandbox Code Playgroud)

我已经被困在这个问题上很长时间了。
任何帮助将不胜感激!

Hvi*_*age 3

/我希望他能发表评论

sshd 需要(通常,但尽管您没有指定确切的用例等)为每次登录分配一个 pty,但是,在您的情况下,ssh "echo hi; sleep 100s" 不会分配 pty,所以不需要 kernel.pty.max 设置...除非您希望数千个用户登录*...来测试它,您需要将 -t 选项添加到您的测试中,即。ssh -t“echo hi;睡眠 100 秒”

回到error: reexec socketpair: Too many open files 在 Wheezy dist 升级到 Jessie 系统上进行测试的问题,我发现 /etc/security/limit* 不会更改 sshd 的限制。

检查一下cat /proc/<pid-of-sshd>/limits 我的情况,在 /etc/security/limits.conf 中设置后: * nofile soft 65535 * nofile hard 65535 仍然仅报告 sshd 限制的 1024(软)和 4096(硬)。解决方案似乎是使用 ulimit 命令强制脚本内的ulimit -Hn 65535& ,我已将 sshd 的 nofiles 从 1024/4096 提高到 65535/65535ulimit -n 65535/etc/init.d/ssh