IT이야기

Ansible로 디렉토리를 복사하는 것이 왜 그렇게 느린것일까..?

cyworld 2021. 4. 14. 20:49
반응형

Ansible로 디렉토리를 복사하는 것이 왜 그렇게 느린가요?


Ansible을 사용하여 한 호스트에서 다른 호스트로 디렉터리 (900 개 파일, 136MBytes)를 복사합니다.

---
- name: copy a directory
  copy: src={{some_directory}} dest={{remote_directory}}

이 작업은 17 분, 간단한 scp -r <src> <dest>작업은 7 초가 소요됩니다.

ansible 문서 에 따르면 "ControlPersist가 활성화 된 경우 SSH보다 2-6 배 빠르며 paramiko보다 10 배 빠를 수있는 가속 모드 " 를 사용해 보았지만 아무 소용이 없습니다.


TLDR은 : 사용하는 synchronize대신 copy.

copy사용 중인 명령 은 다음과 같습니다 .

- copy: src=testdata dest=/tmp/testdata/

추측으로 동기화 작업이 느리다고 가정합니다. 파일 모듈 문서는 너무 이것을 의미한다 :

"복사"모듈 재귀 복사 기능은 많은 (> 수백) 파일로 확장되지 않습니다. 대안은 rsync를 둘러싼 래퍼 인 동기화 모듈을 참조하세요.

소스를 파헤쳐 보면 각 파일이 SHA1로 처리된다는 것을 알 수 있습니다. 그는 것 hashlib.sha1을 사용하여 구현 . 로컬 테스트는 900 개의 파일 (400MB의 공간을 차지함)에 대해 10 초 밖에 걸리지 않음을 의미합니다.

그래서, 다음 길. 복사는 module_utils / basic.py의 atomic_move 메소드 로 처리됩니다 . 가속 모드가 도움이되는지 확실하지 않지만 ( 대부분 더 이상 사용되지 않는 기능 임) 파이프 라이닝을 시도 하여 로컬에 넣습니다 ansible.cfg.

[ssh_connection]
pipelining=True

그것은하지 않았다 표시 도움말; 내 샘플을 실행하는 데 24 분이 걸렸습니다. 파일을 확인하고 업로드하고 권한을 수정 한 다음 다음 파일에서 시작하는 루프가 분명히 있습니다. ssh 연결이 열려 있어도 많은 명령입니다. 줄 사이를 읽는 것은 약간의 의미가 있습니다. "파일 전송"은 파이프 라이닝에서 수행 될 수 없습니다.

따라서 힌트를 따라 synchronize명령 을 사용하십시오 .

- synchronize: src=testdata dest=/tmp/testdata/

.NET에서도 18 초가 걸렸습니다 pipeline=False. 분명히 synchronize명령은이 경우에 갈 길입니다.

synchronizersync를 사용 하는 것을 기억 하세요. rsync는 기본적으로 mod-time과 파일 크기입니다. 체크섬을 원하거나 필요 checksum=True하면 명령에 추가 하십시오. 체크섬이 활성화 된 경우에도 시간은 실제로 변경되지 않았습니다 (여전히 15-18 초). 나는 검사 옵션을 실행하여 켜져 검증 ansible-playbook-vvvv여기 볼 수 있습니다 :

ok: [testhost] => {"changed": false, "cmd": "rsync --delay-updates -FF --compress --checksum --archive --rsh 'ssh  -o StrictHostKeyChecking=no' --out-format='<<CHANGED>>%i %n%L' \"testdata\" \"user@testhost:/tmp/testdata/\"", "msg": "", "rc": 0, "stdout_lines": []}

synchronize.NET 환경에서는 구성이 어려울 수 있습니다 become_user. 일회성 배포의 경우 소스 디렉토리를 보관하고 unarchive모듈을 사용 하여 복사 할 수 있습니다 .

- name: copy a directory
  unarchive:
    src: some_directory.tar.gz
    dest: {{remote_directory}}
    creates: {{remote_directory}}/indicator_file

내가 찾은 최고의 솔루션은 폴더를 압축하고 unarchive모듈을 사용하는 것 입니다.

450MB 폴더가 1 분 만에 완료되었습니다.


unarchive:
   src: /home/user/folder1.tar.gz
   dest: /opt

synchronize이 경우는보다 선호 되지만 copyrsync에 의해 구워집니다. 이는 rsync (클라이언트-서버 아키텍처)의 단점도 남아 있음을 의미합니다. CPU 및 디스크 경계, 대용량 파일에 대한 느린 파일 내 델타 계산 등입니다. 속도가 매우 중요하므로 여러 시스템으로 빠르고 쉽게 확장 할 수있는 피어 투 피어 아키텍처 기반 솔루션입니다. BitTorrent 기반, Resilio Connect와 같은 것.

참조 URL : https://stackoverflow.com/questions/27985334/why-is-copying-a-directory-with-ansible-so-slow

반응형