왜 scp가 너무 느리고 어떻게 더 빨리 만드는가?


59

파일 배치를 복사하려고하는데 scp매우 느립니다. 다음은 10 개의 파일이있는 예입니다.

$ time scp cap_* user@host:~/dir
cap_20151023T113018_704979707.png    100%  413KB 413.2KB/s   00:00    
cap_20151023T113019_999990226.png    100%  413KB 412.6KB/s   00:00    
cap_20151023T113020_649251955.png    100%  417KB 416.8KB/s   00:00    
cap_20151023T113021_284028464.png    100%  417KB 416.8KB/s   00:00    
cap_20151023T113021_927950468.png    100%  413KB 413.0KB/s   00:00    
cap_20151023T113022_567641507.png    100%  413KB 413.1KB/s   00:00    
cap_20151023T113023_203534753.png    100%  414KB 413.5KB/s   00:00    
cap_20151023T113023_855350640.png    100%  412KB 411.7KB/s   00:00    
cap_20151023T113024_496387641.png    100%  412KB 412.3KB/s   00:00    
cap_20151023T113025_138012848.png    100%  414KB 413.8KB/s   00:00    
cap_20151023T113025_778042791.png    100%  413KB 413.4KB/s   00:00    

real    0m43.932s
user    0m0.074s
sys 0m0.030s

이상한 점은 전송 속도가 약 413KB / s이고 파일 크기가 약 413KB이므로 실제로 초당 1 개의 파일을 전송해야하지만 파일 당 약 4.3 초가 걸립니다.

이 오버 헤드가 어디에서 왔는지 더 빨리 이해할 수있는 방법이 있습니까?


3
어떤 속도를 기대하십니까 (예 : 동일한 두 시스템간에 더 높은 전송 속도를 나타내는 다른 프로토콜이 있습니까)? 훨씬 더 큰 파일을 스핑하면 (어쩌면 413KB 파일을 모두 연결했을 때) 어떻게됩니까?
dhag

6
원격 시스템이 클라이언트 IP 주소를 이름으로 확인하려고 시도하는 것 같습니다. 세션이 진행되기 전에 시간 초과를 기다려야합니다. 수정을 조사 할 수 있습니다 (예 : 대상의 / etc / hosts 파일에 IP 주소 추가).
wurtel

4
-C 플래그는 전송 중에 압축을 가능하게합니다. 문제는 전송을 시작하는 오버 헤드로 보이지만 압축은 기본적으로 "무료"이며 거의 항상 도움이됩니다.
Sam

@ wurtel : 당신이보고있는 것을 보지 못합니다. 어쨌든 하나의 역방향 DNS 호출 만 있으면됩니다.
James K Polk

보안이나 원격 복사에만 SCP에 의존하고 있습니까?
Freiheit

답변:


17

@ wurtel의 의견은 아마도 맞을 것입니다 : 각 연결을 설정하는 데 많은 오버 헤드가 있습니다. 이 문제를 해결 하면 더 빠른 전송이 가능합니다 (그렇지 않으면 @roaima의 rsync해결 방법 만 사용하십시오 ). 비슷한 크기의 파일 ( head -c 417K /dev/urandom > foo.1및 해당 파일의 일부 사본)을 연결하는 데 시간이 걸리는 호스트 (HOST4)와 매우 빠르게 응답하는 호스트 (HOST1) 로 전송하는 실험 을 수행했습니다.

$ time ssh $HOST1 echo


real    0m0.146s
user    0m0.016s
sys     0m0.008s
$ time scp * $HOST1:
foo.1                                         100%  417KB 417.0KB/s   00:00    
foo.2                                         100%  417KB 417.0KB/s   00:00    
foo.3                                         100%  417KB 417.0KB/s   00:00    
foo.4                                         100%  417KB 417.0KB/s   00:00    
foo.5                                         100%  417KB 417.0KB/s   00:00    

real    0m0.337s
user    0m0.032s
sys     0m0.016s
$ time ssh $HOST4 echo


real    0m1.369s
user    0m0.020s
sys     0m0.016s
$ time scp * $HOST4:
foo.1                                         100%  417KB 417.0KB/s   00:00    
foo.2                                         100%  417KB 417.0KB/s   00:00    
foo.3                                         100%  417KB 417.0KB/s   00:00    
foo.4                                         100%  417KB 417.0KB/s   00:00    
foo.5                                         100%  417KB 417.0KB/s   00:00    

real    0m6.489s
user    0m0.052s
sys     0m0.020s
$ 

1
고마워요, 정말 흥미 롭습니다. scp 출력은 호스트마다 완전히 다르더라도 같은 시간을 표시하면 손상됩니다. 아마도 전체 시간에 연결 시간을 포함시켜야합니다.
laurent

1
따라서 각 파일마다 한 번씩 새로운 연결을 만드는 가설이 있습니까?
rogerdpack

59

단일 연결을 사용하여 모든 소스 파일을 전송하는 rsync(이상 ssh)을 사용할 수 있습니다 .

rsync -avP cap_* user@host:dir

당신이하지 않은 경우 rsync(왜!?하지 않음) 당신은 사용할 수 tarssh임시 파일을 생성하는 것을 피한다, 이는 다음과 같이 :

tar czf - cap_* | ssh user@host tar xvzfC - dir

rsync그것이 중단되는 경우 재시작이기 때문에, 다른 모든 조건이 동일, 선호된다.


6
단일 scp호출로 단일 연결을 사용하여 모든 파일을 전송하지는 않습니까?
CVn

1
tarpipe의 경우, f -tar는 기본적으로 stdout / stdin으로 출력 / 읽기 때문에 양쪽에 on이 필요하지 않습니다 . 그렇게 tar cz cap_* | ssh user@host tar xvzC dir할 것입니다.
tremby

1
@tremby는 아닙니다. tar다른 기본값으로 컴파일 할 수 있습니다 ( tar --show-defaultsGNU tar를 사용하고 있는지 여부 /etc/default/tar와 두 경우 모두 TAPE환경 변수를 잊지 마십시오 )
roaima

1
@ MichaelKjörling은 처음 scp에 각 파일에 대해 새로운 연결을 만들 것이라고 생각 했지만 기억하면서 tshark-다시 확인한 후에 내가 틀렸다는 것을 깨달았습니다. 이 시점에서 OP가 scp파일 당 그렇게 오래 걸리는 이유를 더 이상 확신 할 수 없습니다.
roaima

@roaima, 재미있는, 감사합니다. stdin / stdout이 지금까지 기본값이 아닌 것을 본 적이 없습니다. 내 Mac 컴퓨터의 BSD tar는 Linux 페이지의 GNU tar와는 달리 매뉴얼 페이지에 TAPE env var를 언급하지 않습니다.
tremby

15

시간이 걸리는 것은 양도 협상입니다. 일반적으로 b 바이트 의 n 파일에 대한 조작은 각각 n * b 바이트 의 단일 파일에 대한 단일 조작보다 훨씬 오래 걸립니다 . 디스크 I / O의 경우에도 마찬가지입니다.

주의 깊게 살펴보면이 경우 전송 속도가 size_of_the_file / secs 임을 알 수 있습니다 .

파일을보다 효율적으로 전송하려면 파일을 함께 묶은 tar다음 tarball을 전송하십시오.

tar cvf myarchive.tar cap_20151023T*.png

또는 아카이브를 압축하려는 경우

tar cvzf myarchive.tar.gz myfile*

압축 여부는 파일 내용에 따라 다릅니다 (예 : JPEG 또는 PNG 인 경우 압축이 적용되지 않습니다.


PNG는 수축을 사용하며 gzipping도 의미가 없습니다.
Arthur2e5

타르를 압축해도 파일을 더 이상 압축 할 수 없을 때 부정적인 영향을 미치지 않기 때문에 그냥 넣는 것이 좋습니다.-z
Centimane

1
@Dave 압축 할 수 없거나 네트워크 속도가 빠르면 속도가 느려집니다.
Davidmh

@Davidmh는 이것이 상당한 금액입니까? 이미 압축 된 파일을 압축하면 압축 할 수있는 것을 살펴보고 아무것도 없다는 것을 알기 때문에 상당히 빠릅니다. 내가하면 생각 따라 다름 tar이 동시에 압축 및 보관 될 경우 압축에 대한 두 번째 패스를하지 정상적으로
Centimane

3
@ 필자의 경우 (현대 7000 rpm HD의 데이터, 고급 CPU, 매우 빠른 네트워크, 전혀 자랑하지 않음) 압축하지 않은 tar는 순전히 IO에 제한되어 있지만 -zCPU에 제한이 있으며 속도가 훨씬 느립니다. gzip은 항상 압축을 시도하므로 속도가 느려집니다. 결국, 압축하려고 시도 할 때까지 바이트 문자열을 압축 할 수 있는지 알 수 없습니다. 내 설정에서 일반 텍스트 파일을 전송할 때도 압축이없는 rsync는 가장 가벼운 압축에 비해 2-3 배 빠릅니다. 물론 YMMV.
Davidmh

6

scp가 특히 대역폭이 높은 네트워크에서 속도보다 느려 야하는 또 다른 이유는 네트워크 성능 병목 현상이 발생하는 내부 흐름 제어 버퍼를 정적으로 정의했기 때문입니다.

HPN-SSH 는 OpenSSH의 패치 버전으로 이러한 버퍼의 크기를 증가시킵니다. 그것은 scp 전송 속도에 차이를 만듭니다 (사이트의 차트를 참조하지만 개인 경험에서도 이야기합니다). 물론, 이점을 얻으려면 모든 호스트에 HPN-SSH를 설치해야하지만 정기적으로 대용량 파일을 전송해야하는 경우에는 그만한 가치가 있습니다.


5

병렬 gzip과 netcat을 사용하여 데이터를 빠르게 압축하고 복사하는 여기에 설명 된 기술 을 사용했습니다.

그것은 다음과 같이 요약됩니다 :

# SOURCE: 
> tar -cf - /u02/databases/mydb/data_file-1.dbf | pigz | nc -l 8888

# TARGET:
> nc <source host> 8888 | pigz -d | tar xf - -C /

tar를 사용하여 파일을 수집합니다. 그런 다음 pigz를 사용하여 파일을 압축하고 전송하는 많은 CPU 스레드를 얻습니다. 네트워크 전송은 netcat을 사용하고 있습니다. 수신 측에서 netcat은 수신 한 후 (병렬로) 압축 해제하고 압축을 해제합니다.


3
nc암호화되지 않았습니다. ssh -D마법을 추가 할까요?
Arthur2e5

이것은 실제로 꽤 훌륭하다
Jabran Saeed

5

이 문제는을 통해 큰 mp4 파일의 사이트 간 전송을 수행했습니다 scp. ~ 250KB / s를 받고있었습니다. 대상 방화벽에서 UDP 플러드 보호 (FP)를 비활성화 한 후 전송 속도가 6.5MB / s로 증가했습니다. FP를 다시 켤 때 속도는 ~ 250KB / s로 떨어졌습니다.

발신자 : cygwin, 수신자 : Fedora 20, Firewall Sophos UTM.

SSH는 무엇을 위해 UDP를 사용합니까? @ superuser.com - 내가 무엇을 읽고 직접하지 않습니다.

방화벽 로그를 검토 할 때 개인 사이트 간 내부 VPN 주소가 아닌 공개 IP 주소를 통해 소스 및 대상 포트 4500에서 플러드 감지가 발생했습니다. 따라서 내 문제는 scpTCP 데이터가 궁극적으로 ESP 및 UDP 패킷으로 암호화되어 캡슐화되어 FP에 영향을받는 NAT 통과 상황 인 것 같습니다 . scp방정식에서 제거하기 위해 VPN을 통해 Windows 파일 복사 작업을 실행했으며 scpFP를 사용하거나 사용하지 않는 것과 유사한 성능을 발견했습니다 . 또한 iperfTCP를 통해 테스트를 실행하고 FP로 2Mbits / sec를 보았으며, 그렇지 않으면 55Mbits / sec로 나타났습니다.

NAT-T는 IPSec과 어떻게 작동합니까? @ cisco.com

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.