私たちが最初にすることは、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
答え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秒かかり、可能なように見えます。