모든 노드에서 연속적으로 명령/스크립트 등을 자동으로 실행하는 원격 제어 서버가 있습니다. 성능과 속도를 향상시키기 위해 병렬로 실행하고 싶습니다. 약 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
그 당시 목록에서 하나의 항목만 인쇄합니다.sshconfig
-P
잘 작동하는 것 같은 숫자를 찾을 때까지 다양한 설정으로 테스트 실행해 볼 수 있습니다 .
원격 시스템의 로그인 쉘이 인 경우 다음을 bash
고려할 수도 있습니다.
code=$( base64 -d <<<"$COMMAND" )
printf '%s\n' "${sshconfig[@]}" |
xargs -P 4 -I {} ssh "{}" "$code"