파일 전송 속도를 높이기위한 역 다중화


19

한 컴퓨터에서 다른 컴퓨터로 많은 양의 데이터를 보냈습니다. rsync (또는 다른 방법)로 보내면 320kb / sec로 일정하게 유지됩니다. 한 번에 두세 번의 이체를 시작하면 각각 320으로 가고 한 번에 네 번하면 링크가 최대가됩니다.

가능한 빨리 데이터를 보낼 수 있어야하므로 파일 전송과 역 다중화를 수행 할 수있는 도구가 필요합니다. 일반적인 솔루션이 필요하므로 소스 컴퓨터에서 split을 실행하고 다른 쪽에서 함께 catting하는 것은 실용적이지 않습니다. 자동화 된 방식으로 작동하려면 이것이 필요합니다.

이를 수행하는 도구가 있습니까, 아니면 직접 만들어야합니까? 발신자는 CentOS이고 수신자는 FreeBSD입니다.

답변:


29

모든 것이 합쳐 짐에 따라 원격 미러 명령의 '성배'를 제시합니다. lftp제안에 대한 davr 감사합니다 .

lftp -c "mirror --use-pget-n=10 --verbose sftp://username:password@server.com/directory" 

위의 내용은 원격 디렉토리를 재귀 적으로 미러링하여 전송 될 때 각 파일을 10 개의 스레드로 나눕니다!


lftp훌륭하지만 UPloading 할 때 멀티 파트를 수행 할 수 없습니다. 나는 사용하고 mirror --use-pget-n=20 -R있지만 --use-pget-n다운로드 할 때만 작동 하는 것 같습니다 .
Dan

추신 : -P20여러 파일을 업로드하기 위해 작동하지만 각 파일을 여러 부분으로 나눌 수 없습니다.
Dan

1
lftp는 세그먼트 / 멀티 파트 업로드를 지원하지 않습니다. 사용하려면 대상 측에서 전송을 시작해야합니다 pget -n.
apraetor

기억 mirror양방향입니다; pget인수는 파일이 다운로드되고 적용됩니다.
apraetor

10

작동 할 수있는 몇 가지 도구가 있습니다.

  • LFTP -FTP, HTTP 및 SFTP를 지원합니다. 단일 파일을 다운로드하기 위해 다중 연결 사용을 지원합니다. remoteServer에서 localServer로 파일을 전송하려는 경우 localServer에 LFTP를 설치하고 다음을 실행하십시오.

    lftp -e 'pget -n 4 sftp://userName@remoteServer.com/some/dir/file.ext'

    '-n 4'는 병렬로 사용할 연결 수입니다.

  • 그런 다음 많은 '다운로드 가속기'도구가 있지만 일반적으로 원격 서버에서 설정하지 않아도되는 HTTP 또는 FTP 만 지원합니다. 일부 예는 Axel , aria2ProZilla


8

파일 용량이 적고 큰 경우 lftp -e 'mirror --parallel=2 --use-pget-n=10 <remote_dir> <local_dir>' <ftp_server>: 각 파일을 10 개 세그먼트로 분할하여 총 20 개의 ftp 연결로 2 개의 파일을 다운로드합니다 <ftp_server>.

작은 파일이 많은 경우 다음을 사용하십시오 lftp -e 'mirror --parallel=100 <remote_dir> <local_dir>' <ftp_server>. 세그먼트 화하지 않고 병렬로 100 개의 파일을 다운로드합니다. 총 100 개의 연결이 열립니다. 이것은 서버에서 사용 가능한 클라이언트를 숨기거나 일부 서버에서 차단 될 수 있습니다.

--continue작업을 다시 시작하는 데 사용할 수 있습니다 :) 및 -R다운로드 대신 업로드 옵션 (인수 순서를로 변경 <local_dir> <remote_dir>).


1
매개 변수의 오타 : --use-pget-m 대신 --use-pget-n. 편집하려고했지만 편집 시간이 짧았습니다.
Tony

2

연결 당 320KB / s 제한을 일으키는 원인에 따라이 문제를 피하기 위해 TCP 설정을 조정할 수 있습니다. 내 생각 에 ISP가 명시 적으로 연결 당 속도를 제한하는 것은 아닙니다 . 조절에 대한 두 가지 범인이 있습니다.

  1. 두 시스템 간의 일부 링크가 포화되어 패킷을 삭제합니다.
  2. 대역폭 지연 제품 이 너무 커서 TCP 창이 포화 상태 입니다.

첫 번째 경우 각 TCP 연결은 표준 TCP 혼잡 제어에서 효과적으로 동일하게 경쟁합니다. 혼잡 제어 알고리즘을 변경하거나 백 오프 양을 줄임으로써이를 개선 할 수도 있습니다.

두 번째 경우에는 패킷 손실에 의해 제한되지 않습니다. 연결을 추가하면 전체 창 크기를 확장 할 수 있습니다. 창 크기를 수동으로 늘릴 수 있으면 문제가 해결됩니다. 연결 대기 시간이 충분히 높은 경우 TCP 창 크기 조정 이 필요할 수 있습니다 .

왕복 "핑"시간에 총 연결 속도를 곱하여 대략적으로 필요한 창의 크기를 알 수 있습니다. 1280KB / s는 왕복 밀리 초당 1280 (1024는 11024 = 1K의 경우 1311) 바이트가 필요합니다. 64K 버퍼는 약 50ms의 대기 시간으로 최대치가 될 것입니다. 이는 상당히 일반적인 현상입니다. 그런 다음 16K 버퍼는 약 320KB / s로 포화됩니다.


1

데이터는 어떻게 구성되어 있습니까? 큰 파일 몇 개? 몇 개의 큰 디렉토리? 디렉토리 트리의 특정 브랜치에서 여러 rsync 인스턴스를 생성 할 수 있습니다.

그것은 모두 소스 데이터의 구조에 달려 있습니다. 파일을 슬라이스, 다이 싱 및 재 조립할 수있는 수많은 유닉스 도구가 있습니다.


임의의 데이터. 때로는 큰 디렉토리, 때로는 단일 파일입니다.
ZimmyDubZongyZongDubby

1

암호가없는 ssh 로그인을 설정할 수 있으면 4 개의 파일 (-L)을 처리 할 때마다 4 개의 동시 scp 연결 (-n)이 열립니다.

찾기 . 타입 f | xargs -L 4 -n 4 /tmp/scp.sh user @ host : path

파일 /tmp/scp.sh :

#!/bin/bash

#Display the help page
function showHelp()
{
    echo "Usage: $0 <destination> <file1 [file2 ... ]>"
}

#No arguments?
if [ -z "$1" ] || [ -z "$2" ]; then
    showHelp
    exit 1
fi

#Display help?
if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
    showHelp
    exit 0
fi

#Programs and options
SCP='scp'
SCP_OPTS='-B'
DESTINATION="$1";shift;

#Check other parameters
if [ -z "$DESTINATION" ]; then
    showHelp
    exit 1
fi

echo "$@"

#Run scp in the background with the remaining parameters.
$SCP $SCP_OPTS $@ $DESTINATION &

0

inode의 모든 파일을 정렬하고 (find / mydir -type f -print | xargs ls -i | sort -n) ssh를 통해 cpio와 같이 전송하십시오. 이렇게하면 디스크가 최대가되고 병목 현상이 발생하는 네트워크가 만들어집니다. 그보다 빠르면 네트워크를 통과 할 때 가기가 어렵습니다.


그건 완전 몰래 :)
워렌

모든 파일 시스템이 이것으로부터 향상을 보장 할 수는 없습니다. inode 레이아웃이 어떻게 수행되는지에 달려 있습니다.
Jimmy Hedman

병목 현상은 각 TCP 연결이 320KB / 초로 제한된다는 것입니다. 병렬 TCP 연결로 파일을 보내서 네트워크 한도 (약 1200KB / 초)까지 320 * NumConnections를 얻습니다. inode에 의한 정렬은 이것을 달성하지 못합니다.
ZimmyDubZongyZongDubby 2009

TCP 속도를 제한하는 것은 무엇입니까? 기계 사이의 라우터?
Jimmy Hedman

내 ISP. 순 중립? 하아!
ZimmyDubZongyZongDubby 2009

0

파일을 청크로 전송할 수있는 도구를 알고 있습니다. 이 툴은 두 호스트 모두에서 사용할 수있는 'rtorrent'패키지 / 포트라고합니다. 또한 멋진 ncurses 화면에서 모든 전송 상태를 검토 할 수 있습니다.

간단한 bash 스크립트를 작성하여 "* .torrent"파일 작성을 자동화하고 명령을 원격 시스템에 ssh하여 다운로드 할 수 있습니다. 이것은 조금 추한 것처럼 보이지만 개발하지 않고 간단한 해결책을 찾지 못할 것이라고 생각합니다. :)


1
파일 전송에 두 대의 컴퓨터 만 관련된 경우 토렌트가 어떻게 도움이됩니까? 토런트의 아이디어는 클라이언트 요청자가 데이터를 사용할 수있게하는 파종기 떼입니다.
DaveParillo 2009

네가 옳아. 그러나 누가 단일 파종 자에게 유용하지 않다고 말했습니까? ;)
kolypto 2009

2
토렌트 클라이언트가 단일 피어로 여러 개의 TCP 연결을 생성하면 OP 문제를 해결할 수 있습니다. 그러나 토런트 클라이언트가 실제로 단일 피어로 여러 개의 TCP 연결을 작성하는지 여부는 알 수 없습니다.
chronos December

0

FTP는 다운로드에 여러 연결을 사용합니다. VPN을 통한 FTP 또는 SSH를 통한 FTP에 대한 보안 채널을 설정할 수 있으면 네트워크 링크를 최대한 활용할 수 있어야합니다. SSH를 통한 FTP에는 특별한 고려 사항이 필요합니다 (링크 참조).

FTPS (FTP over SSL)도 필요한 작업을 수행 할 수 있습니다.

여러 연결을 지원하는 SFTP 클라이언트를 사용할 수도 있지만 SFTP가 단일 파일에 대해 여러 연결을 지원하는지 확실하지 않습니다. 이렇게하면 대부분의 시간이 필요하지만 하나의 큰 파일 만 전송하면 최대 처리량을 얻지 못할 수 있습니다.


SFTP가 훨씬 쉽고 안전하지는 않습니까?
Mark Renouf

1
@rob : "FTP는 파일 전송을 위해 여러 연결을 사용합니다"는 어디에서 얻었습니까? 일부 클라이언트는 FTP에서 여러 스트림을 다운로드 할 수 있지만 FTP에 업로드 하기 위해 여러 스트림을 허용하는 FTP 클라이언트 / 서버 콤보는 없습니다 .
chronos December

@Mark : 그렇습니다. SFTP가 더 쉽고 똑같이 안전 할 수도 있지만 단일 파일을 전송하기 위해 여러 연결을 지원하는지는 알 수 없습니다. 그래도 제안에 감사드립니다. 목록에 추가하겠습니다.
rob

1
@chronos : 명확하지 않은 죄송합니다; ZimmyDubZongyZongDubby는 FTP를 사용하여 CentOS 서버에서 FreeBSD 클라이언트로 다운로드 할 것을 제안했습니다. "파일 전송"대신 "다운로드"라고 구체적으로 답변을 업데이트했습니다.
rob

-1

해결 방법 1 : 이것이 귀하의 경우에 실용적인지 확실하지 않지만 스팬 아카이브 (예 : 청크로 분할 된 tarfile 또는 스팬 7zip 아카이브)를 만든 다음 rsync의 여러 인스턴스를 사용하여 전송할 수 있습니다 네트워크를 다른 쪽에서 재 조립 / 추출합니다. 인수가 전송 될 디렉토리와 사용할 연결 수를 가진 범용 스크립트를 작성할 수 있습니다. 명백한 단점은 양쪽에 두 배의 여유 공간이 필요하고 양쪽 끝에 파일을 보관 / 추출하는 추가 오버 헤드가 있다는 것입니다.

해결 방법 2 : 더 큰 해결책은 큰 디렉토리 트리를 크기에 따라 하위 트리로 나눈 다음 해당 하위 트리를 병렬로 복사하는 스크립트 나 프로그램을 작성하는 것입니다. 파일없이 전체 디렉토리 구조를 먼저 복사하면 작업을 단순화 할 수 있습니다.


downvote에 대해 자세히 알고 싶은 사람이 있습니까?
rob

-1

신뢰할 수있는 환경에서 두 대의 머신을 실행하고 있습니까? netcat 시도해 볼 수 있습니다. 서버 측에서 :

tar -czf - ./yourdir | nc -l 9999

그리고 클라이언트에서 :

nc your.server.net 9999 > yourdir.tar.gz

클라이언트 연결이 ssh 터널을 사용하도록 할 수 있습니다.

ssh -f -L 23333:127.0.0.1:9999 foo@your.server.net sleep 10; \
    nc 127.0.0.1 23333 > yourdir.tar.gz

전체 파티션조차도 다음과 같이 이동할 수 있습니다.

dd if=/dev/sda1 | gzip -9 | nc -l 9999

그리고 클라이언트에서 :

nc your.server.net 9999 > mysda1.img.gz

.

노트

netcat은 가장 안전한 전송 도구는 아니지만 올바른 환경에서는 오버 헤드가 적기 때문에 빠를 수 있습니다.

HowtoForge에는 좋은 예제 페이지가 있습니다.


이것은 그의 질문에 대답하지 않는 일반적인 대답처럼 보입니다. 솔루션이 병렬로 어떻게 전송되는지 알 수 없습니다. nc는 내가 아는 한 단 하나의 연결 일뿐입니다.
davr

그러나 nc를 사용하면 열린 포트를 제어 할 수 있습니다. 기울어 진 경우 10,000을 지정할 수 있습니다.
DaveParillo 2009
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.