我的目标是允许在单个服务器上运行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发送的命令中,在我的实际脚本中就是这种情况,但是我在这里做了错字。我已经相应地更新了主要帖子。非常感谢您指出!!