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

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

我的目标是允许10000并发SSH运行在单身的服务器。

为了简单起见,我通过 ssh 连接到本地主机:

for i in `seq 1 10000`; do
    ssh localhost "echo ${i}; sleep 100"  >>./info 2>>./log &
done

sleep 100是为了确保当第 10000 个 ssh 启动时,第一个 ssh 仍然处于连接状态,因此确实有 10000 个同时 SSHs。

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

1. ssh_exchange_identification: Connection closed by remote host

2. ssh_exchange_identification: read: Connection reset by peer

我做了以下修改:

  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 个并发SSHs到单个服务器,但它们不适用于2000及以上SSHs。

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

回到在 Wheezy dist 升级到 Jessie 系统上进行测试的问题error: reexec socketpair: Too many open files ,我发现 /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

答案2

/etc/security/limits.conf等之所以不起作用,是因为它只适用于通过PAM登录的用户(不包括系统服务)。

为了设置服务限制,您可以(例如 Ubuntu 20)编辑 /etc/systemd/system.conf 并添加一行,例如:

DefaultLimitNOFILE=<Soft Limit>:<Hard Limit>

似乎单独重新启动 sshd 守护进程是不够的 - 只有在系统重新启动(或可能运行“sudo systemctl daemon-reload”)后,新设置才会生效。

更多详细信息请参见此处: https://medium.com/@shihtiy.tw/linux-max-open-file-limit-with-system-service-ca8ff2562d1c

相关内容