SSHを介して2000を超えるノードに接続する方法は?

SSHを介して2000を超えるノードに接続する方法は?

私たちが最初にすることは、sshを使用して2,000を超えるサーバーから簡単な情報を取得することです。これは30秒で完了することです。

GNUパラレルとPython paramiko +マルチプロセッシングの使用

どちらも速度を遅くするランダムなボトルネックがあります。この問題を修正できますか?カーネルのチューニングは完了しましたか?使用されるオペレーティングシステムはCentOS 7(Core 24)です。

Pythonコードの追加

        ssh=paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(host,username=username,password=password)
        stdin, stdout, stderr = ssh.exec_command(command)
        outlines=stdout.readlines()
        resp=''.join(outlines)
        print(resp)
        stdin.close()
        ssh.close()

    except Exception as err:
 
        print(err)



if __name__ == '__main__':
    start = time.time()
    host = subprocess.check_output("echo 10.0.{{1..26},{51..146}}.{1..100}", shell="True", universal_newlines=True)
    list = host.strip().split(" ")
    print (list)
    pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
    pool.map(loadavg, list)
    pool.close()
    pool.join()
    print("time :", time.time() - start)

答え1

アンシプール数千台のサーバーやデータを管理/交換する作業に最適です。

アンサーブルはスクリプト、各ホストに対して実行するコマンドをリストします。そして戦略 設定できますすべてのホストが順番に動作していますか、それとも同時にホストに接続していますか?

それでも30秒のウィンドウが許可されていない場合は、Paulの「ツリー」アプローチであるAnsibleサポートと簡単に組み合わせることができます。代表団 正確にこのユースケースの場合。

Ansibleはまた、Pythonを書く手間も軽減します。接続するホストの範囲を指定する簡単な構文があります。

答え2

20秒以内に4000個のホストを処理し、10秒以内に2000個のホストを処理できます。

killall ssh-agent
sudo sysctl -w net.ipv4.neigh.default.gc_thresh3=30000
sudo sysctl -w net.ipv4.neigh.default.gc_thresh2=20000
sudo sysctl -w net.ipv4.neigh.default.gc_thresh1=10000

cat hosts |
  time parallel --lb --roundrobin --pipe -I dummy -N 50 parallel --timeout 4 --retries 10 -j50 --tag ssh  -o StrictHostKeyChecking=no root@{} echo {}

それgc_thresh以外の場合、arp テーブルはオーバーフローします。これはssh紙詰まりを引き起こす可能性があります。

多くの場合、arp -n | grep incomplete以下を試してください。

parallel 'echo 3600000 >' ::: /proc/sys/net/ipv4/neigh/*/base_reachable_time_ms

これにより、arpエントリが更新される前に1時間保持されます。

編集する

次の条件が満たされると、タイムアウトを再現できます。

  • LANに直接接続されたホスト
  • arpキャッシュがウォームアップされていません。
  • 並列作業がたくさんあります。

答え3

マルチサイトアプローチを検討することができます。

2 つのレベルで、初期インスタンスが 40 台のサーバーに接続し、それぞれが 50 台の異なるサーバーに接続し、結果を渡すようにします。各レベルは15秒以内に完了する必要があります。初期要求には、各補助ノードが担当するノードがリストされます。

3つのレベルを処理できる場合、ファンアウトは13 x 13 x 13に低下し、各レベルには10秒かかり、可能なように見えます。

関連情報