scp가 왜 그렇게 느리고 어떻게 더 빠르게 만들 수 있나요?

scp가 왜 그렇게 느리고 어떻게 더 빠르게 만들 수 있나요?

일괄 파일을 복사하려고 하는데 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초에 1개의 파일을 전송해야 하는데, 각 파일당 약 4.3초가 소요됩니다.

이 오버헤드가 어디서 발생하는지, 그리고 더 빠르게 만들 수 있는 방법이 있나요?

답변1

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

rsync -avP cap_* user@host:dir

하나도 없다면 rsync(왜 안되나요!?) tarwith this 을 사용하면 ssh임시 파일 생성을 피할 수 있습니다(두 옵션은 동일합니다).

tar czf - cap_* | ssh user@host tar xvzfC - dir
tar cf - cap_* | gzip | ssh user@host 'cd dir && gzip -d | tar xvf -'

rsync다른 모든 조건이 동일하다면 정전 시 다시 시작할 수 있으므로 선호됩니다.

답변2

@wurtel의 댓글아마도 맞을 것입니다. 각 연결을 설정하는 데 많은 오버헤드가 있습니다.이 문제를 해결할 수 있다면전송 속도가 더 빨라집니다(그렇지 않은 경우 @를 사용하세요).Emma Luo의 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
$ 

답변3

이적 협상에는 시간이 걸립니다. 일반적으로 말하면, 운영N기록한 것두번째각 바이트는 단일 파일에 대한 단일 작업보다 훨씬 오래 걸립니다.N*두번째바이트. 예를 들어 디스크 I/O의 경우에도 마찬가지입니다.

자세히 살펴보면 이 경우 전송 속도가 다음과 같은 것을 알 수 있습니다.파일 크기/두번째.

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

tar cvf myarchive.tar cap_20151023T*.png

또는 아카이브를 압축하고 싶다면,

tar cvzf myarchive.tar.gz myfile*

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

답변4

scp가 예상보다 느린 또 다른 이유(특히 고대역폭 네트워크에서)는 결국 네트워크 성능 병목 현상이 될 수 있는 내부 흐름 제어 버퍼를 정적으로 정의했기 때문입니다.

HPN-SSH이러한 버퍼의 크기를 늘리는 OpenSSH의 패치 버전입니다. 그것은 만든다많은scp 전송 속도의 차이(웹사이트의 차트를 참조하세요. 하지만 개인적인 경험에서도 말씀드리고 있습니다). 물론 이러한 이점을 얻으려면 모든 호스트에 HPN-SSH를 설치해야 하지만 대용량 파일을 자주 전송해야 하는 경우에는 그만한 가치가 있습니다.

관련 정보