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


9

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

为简单起见,我将ssh-sing到localhost:

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

sleep 100是为了确保第10000个ssh启动时,第一个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)。
2015年

1
我认为sleep 100s您的想法没有。它不会在ssh会话中执行,而是在您自己的计算机上执行。
丹尼尔·库尔曼

1
@Jakuje感谢您提醒我检查服务器日志!我发现了error: reexec socketpair: Too many open files,所以我想以前的值nofile(即65535)远远不够。我不熟悉ControlMaster,但我会尝试的,谢谢!!:)
克拉拉

1
有趣的是,当我执行其中一行时,a ps axu | egrep "ssh|sleep" | grep -v grep仅列出sleep 100s,而不列出ssh。我认为您应该将命令更改为ssh "echo hi; sleep 100s"
丹尼尔·库尔曼

2
@danielkullmann是的,您是绝对正确的- sleep 100应该在通过ssh发送的命令中,在我的实际脚本中就是这种情况,但是我在这里做了错字。我已经相应地更新了主要帖子。非常感谢您指出!!
克拉拉

Answers:


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 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 -Hn 65535ulimit -n 65535内部/etc/init.d/ssh脚本使用的ulimit命令,我从四千零九十六分之一千零二十四上调的sshd的NOFILES到65535分之65535

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.