我的目标是允许在单个服务器上运行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
我做了以下修改:
- 在
/etc/security/limits.conf
和中/etc/security/limits.d/90-nproc.conf
,将soft&hardnofile
和设置nproc
为65535(这是可能的最大值吗?-更新:否。最大值是1048576) - 在中
/etc/sysctl.conf
,设置kernel.pty.max = 65535
- 在
/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
我已经坚持了很长时间。
任何帮助将不胜感激!
sleep 100s
您的想法没有。它不会在ssh会话中执行,而是在您自己的计算机上执行。
error: reexec socketpair: Too many open files
,所以我想以前的值nofile
(即65535)远远不够。我不熟悉ControlMaster,但我会尝试的,谢谢!!:)
ps axu | egrep "ssh|sleep" | grep -v grep
仅列出sleep 100s
,而不列出ssh
。我认为您应该将命令更改为ssh "echo hi; sleep 100s"
。
sleep 100
应该在通过ssh发送的命令中,在我的实际脚本中就是这种情况,但是我在这里做了错字。我已经相应地更新了主要帖子。非常感谢您指出!!