우리가 가장 먼저 할 일은 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
다중 사이트 접근 방식을 고려할 수 있습니다.
두 가지 수준에서 초기 인스턴스가 40개의 서버에 연결하고 각각은 50개의 다른 서버에 연결하고 결과를 전달하도록 합니다. 각 수준은 15초 이내에 완료되어야 합니다. 초기 요청에는 각 보조 노드가 담당하는 노드가 나열됩니다.
세 가지 레벨을 처리할 수 있는 경우 팬아웃은 13 x 13 x 13으로 떨어지고 각 레벨에는 10초가 걸리므로 가능한 것처럼 보입니다.