すべてのノードで連続的にコマンド/スクリプトなどを自動的に実行するリモートコントロールサーバーがあります。パフォーマンスとスピードを向上させるために並列に実行したいと思います。約180ノードでコマンドを実行しています。シリーズではすべて完了するのに約2時間かかりました。だから今はスピードを探しています。擬似コードは以下の通りです。私はbased64を使用して別のノードにコマンドを送信します。任意に複雑なコマンドを実行するために使用できます。
for host in ${sshconfig[@]}; do
ssh "$host" "echo $COMMAND | base64 -d | bash" &
done
しかし、私が間違えてノードがたくさんあるのを忘れてしまったので、私のbashスクリプトは各ノードに多くのプロセスを作成し、その結果サーバーを制御するシステムがダウンして終了しました。これで接続できなくなりました。
bashスクリプトからメモリを割り当てる方法を知りたいです。使いやすいので、ssh
bashは私の状況には最適ですが、システムのクラッシュなどを心配することなく、並列に実行してパフォーマンスを向上させる方法を知りたいです。
ベストアンサー1
パラレルSSH接続の数を制限するには、次のものを使用できますxargs
。
printf '%s\n' "${sshconfig[@]}" |
xargs -P 4 -I {} ssh "{}" "echo $COMMAND | base64 -d | bash"
-P 4
これにより、最大4つの並列インスタンスでコマンド(提供)が実行されます。この-I {}
オプションは、コマンドの文字列をxargs
標準入力から読み取った文字列に置き換えます。{}
に接続されている標準入力は、printf
その時点でリストから1つの項目のみを印刷します。sshconfig
-P
うまく動作するような数字が見つかるまで、さまざまな設定でテストを実行してみることができます。
リモートシステムのログインシェルがある場合は、次のこともbash
考慮できます。
code=$( base64 -d <<<"$COMMAND" )
printf '%s\n' "${sshconfig[@]}" |
xargs -P 4 -I {} ssh "{}" "$code"