我的目标是允许 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)
我做了以下修改:
/etc/security/limits.confand 中/etc/security/limits.d/90-nproc.conf,将 soft&hard nofile&设置nproc为 65535(这是可能的最大值,对吗?- 更新:否。最大值为1048576)/etc/sysctl.conf,设置kernel.pty.max = 65535/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)
我已经被困在这个问题上很长时间了。
任何帮助将不胜感激!
/我希望他能发表评论
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
| 归档时间: |
|
| 查看次数: |
3030 次 |
| 最近记录: |