私の目標は、1台のサーバーで10000の同時SSHを実行できるようにすることです。
簡単にするために、私はlocalhostにsshしています。
for i in `seq 1 10000`; do
ssh localhost "echo ${i}; sleep 100" >>./info 2>>./log &
done
sleep 100
10000番目のsshが起動したときに、1番目のsshがまだ接続されていることを確認するためです。これにより、実際には10000のsshが同時に 存在します。
そして、ここに私が得た2種類のエラーメッセージがあります:
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
、ハードセットソフト&nofile
&nproc
65535(これは右の最大の可能な値である-更新:?なし最大値である。1048576)- で
/etc/sysctl.conf
、kernel.pty.max = 65535
- で
/etc/ssh/sshd_config
、を設定しMaxStartups 10000
ます。
これらの変更により、1つのサーバーに対して1000の同時ssh s を正常に実行できますが、2000以上のssh s では機能しません。
一部の人々は、の値を変更することが示唆されているMaxSessions
(?実際に私はその使用状況については明らかではないよ:どのように私の場合には影響を与え多重ん)、/proc/sys/net/core/netdev_max_backlog
そして/proc/sys/net/core/somaxconn
、彼らは違いはありませんように見えます。
さらに、それらが異なるサーバーへの10,000の同時ssh sである場合、エラーは発生しません(問題は単一のサーバーに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を介して送信されるコマンドに含まれているはずですが、ここではタイプミスをしました。それに応じてメインの投稿を更新しました。ご指摘ありがとうございます!!