일괄 파일을 복사하려고 하는데 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
(왜 안되나요!?) tar
with 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의 경우에도 마찬가지입니다.
자세히 살펴보면 이 경우 전송 속도가 다음과 같은 것을 알 수 있습니다.파일 크기/두번째.
파일을 보다 효율적으로 전송하려면 파일을 tar
tarball로 묶은 다음 전송하십시오.
tar cvf myarchive.tar cap_20151023T*.png
또는 아카이브를 압축하고 싶다면,
tar cvzf myarchive.tar.gz myfile*
압축 여부는 파일 내용에 따라 다릅니다. JPEG 또는 PNG인 경우 압축이 적용되지 않습니다.
답변4
scp가 예상보다 느린 또 다른 이유(특히 고대역폭 네트워크에서)는 결국 네트워크 성능 병목 현상이 될 수 있는 내부 흐름 제어 버퍼를 정적으로 정의했기 때문입니다.
HPN-SSH이러한 버퍼의 크기를 늘리는 OpenSSH의 패치 버전입니다. 그것은 만든다많은scp 전송 속도의 차이(웹사이트의 차트를 참조하세요. 하지만 개인적인 경험에서도 말씀드리고 있습니다). 물론 이러한 이점을 얻으려면 모든 호스트에 HPN-SSH를 설치해야 하지만 대용량 파일을 자주 전송해야 하는 경우에는 그만한 가치가 있습니다.