
私はいくつかの Web サーバーを持っており、クラスターを管理するために、Python スクリプトを使用して接続を自動的に開き、ファイルをサーバーに同期するスクリプトを使用することがありますが、奇妙な問題が発生したのですが、それを修正する方法がよくわかりません。
テストケースを再現するには、すぐに接続しないリモート接続先(LAN や localhost ではない)が必要であり、パスワードを尋ねることなく接続が実行される(キーファイルを使用)必要があります。
私は Fedora を実行している PC を 16 台所有しており、サーバーには Cent OS 5、s120、s121 があります。これらは私が所有する 2 台のサーバーで、IP アドレスは/etc/hosts
s121 と s120 に割り当てられています。
これは、同じシェルで同時に s120 への 9 つの接続と s121 への 9 つの接続を開くサンプル コマンドです。そして、動作します。
gnome-terminal --tab -e "bash -c \"ssh root@s120;\"" --tab -e "bash -c \"ssh root@s120;\"" --tab
- e "bash -c \"ssh root@s120;\"" --tab -e "bash -c \"ssh root@s120;\"" --tab -e "bash -c \"ssh
root@s120;\"" --tab -e "bash -c \"ssh root@s120;\"" --tab -e "bash -c \"ssh root@s120;\"" -- tab
-e "bash -c \"ssh root@s120;\"" --tab -e "bash -c \"ssh root@s120;\"" --tab -e "bash -c \"ssh
root@s121;\"" --tab -e "bash -c \"ssh root@s121;\"" --tab -e "bash -c \"ssh root@s121;\"" --tab
-e "bash -c \"ssh root@s121;\"" --tab -e "bash -c \"ssh root@s121;\"" --tab -e "bash -c \"ssh
root@s121;\"" --tab -e "bash -c \"ssh root@s121;\"" --tab -e "bash -c \"ssh root@s121;\"" --tab
-e "bash -c \"ssh root@s121;\""
このコマンドは、同じシェル上で15の接続を開こうとします。15はすべてTO-> s120です。
gnome-terminal --tab -e "bash -c \"ssh root@s120;\"" --tab -e "bash -c \"ssh root@s120;\"" --tab
-e "bash -c \"ssh root@s120;\"" --tab -e "bash -c \"ssh root@s120;\"" --tab -e "bash -c \"ssh
root@s120;\"" --tab -e "bash -c \"ssh root@s120;\"" --tab -e "bash -c \"ssh root@s120;\""
--tab - e "bash -c \"ssh root@s120;\"" --tab -e "bash -c \"ssh root@s120;\"" --tab -e "bash
- c \"ssh
root@s120;\"" --tab -e "bash -c \"ssh root@s120;\"" --tab -e "bash -c \"ssh root@s120;\""
--tab -e "bash -c \"ssh root@s120;\"" --tab -e "bash -c \"ssh root@s120;\"" --tab -e "bash -c
\"ssh root@s120;\""
そして、15 の接続を開こうとしますが、すぐに 5 つのタブが閉じられ、10 の接続のみが開いたままになります。この問題はterminal_xfce
、(gnome-terminal は少し安定性が低いため、こちらを好みます)でも発生します。
10を超える同時接続は許可されていないようです。
開始時に許可される同時接続数は 10 個までであるようですが、10 個のタブを開いて接続が開始されるのを待つと、同じサーバーへの 10 個のタブを持つ別のターミナルを開くことができます。
(このテスト結果は、クライアントとサーバーの両方で IP TABLES ファイアウォールが無効になっている場合も同じです)
また、この問題は、特に実行時に煩わしくlsyncd
、rsync
ファイル システム上の複数の宛先を同じサーバーに同期すると、接続が OS によって終了されるため予期しない結果につながります。ターミナル テスト ケースは、処理の問題が少なくても、再現が簡単です。
答え1
すべての接続でスクリプト コマンドを使用する場合、gnome-terminal タブを使用する理由は何でしょうか。実際には必要のないリソースを大量に使用しており、それが制限要因の原因となっている可能性があります。
gnome-terminal を強制的に介入させるのではなく、システムに接続を処理させると、ほぼ (目的に応じて) 無制限の数の接続を取得できるはずです。
for a in $( seq 1 50 ); do
ssh root@s120 my_cool_script &
ssh root@s121 my_cool_script &
done
wait
これにより、数秒以内に100の接続(50からs120、50からs121)が作成され、すべて'私のクールなスクリプト'。何をするにしてもスクリプト化されている限り、順調に進みます。
「wait」コマンドを実行すると、スクリプトはバックグラウンド ジョブがすべて完了するまで待機してから続行します。これは必要ない場合もあります。
(さらに、入力する量も大幅に減ります...)
答え2
/etc/ssh/sshd_config で MaxStartups を探します。
sshd への不正な同時ログインを制限します。
デフォルトは 10 です。