2014-07-11 2 views
12

저는 파이썬의 ftplib을 사용하여 로컬 네트워크를 통해 FTP 서버에 많은 양의 데이터 (~ 100 파일 X 2GB)를 전송하고 있습니다. 이 코드는 Ubuntu에서 실행됩니다.Python ftplib 최적의 블록 크기?

# Store file.  
self.ftpClient.storbinary('STOR ' + destination, fileHandle, blocksize = self.blockSize, callback = self.__UpdateFileTransferProgress) 

내 문제는 내가 최적의 블록 크기를 선택합니까 방법 : 여기 내 전화는 (자기 FTPLIB 클라이언트의 래퍼 내 FtpClient 객체이다)? 내 생각에 최적의 블록 크기는 여러 가지에 달려 있으며, 그 중 가장 적은 것은 연결 속도와 대기 시간입니다. 내 코드는 하루 종일 다양한 속도와 다양한 양의 혼잡으로 다양한 네트워크에서 실행됩니다. 이상적으로, 나는 런타임에 최적의 블록 크기를 계산하고 싶다.

최적의 FTP 전송 블록 크기가 최적의 TCP 창 크기와 같을까요? 이것이 사실이고 TCP 창 크기 조정이 켜져 있으면 커널에서 최적의 TCP 창 크기를 얻을 수있는 방법이 있습니까? 리눅스 커널은 언제/어떻게 최적의 윈도우 크기를 결정합니까? 이상적으로는 리눅스 커널에 최적의 블록 크기를 물어볼 수 있으므로 바퀴를 다시 만들지 않아야합니다. http://erlerobotics.gitbooks.io/erle-robotics-python-gitbook-free/content/udp_and_tcp/udp_fragmentation.html

그러나, 당신은 또한에 대해 생각해야합니다;

+0

http://moo.nac.uci.edu/~hjm/HOWTO_move_data.html

내 두 센트를 살펴해야 : //en.wikipedia.org/wiki/Nagle%27s_algorithm). 'TCP_CORK' 옵션을 설정할 수도 있습니다. – Phillip

+0

여기에 어떤 종류의 동시성을 기대합니까? 이것은 단일 스레드 응용 프로그램을위한 것입니까? 멀티 플렉스 된 비동기 I/O를 활용할 수 있습니까? –

답변

7

이 흥미로운 질문은 내가 조금 더 깊이에서 다이빙을했다) 어쨌든

, 여기에 MTU를 확인하는 방법에 좋은 예입니다 다음 : MTU는 지역 현상이며 지역 네트워크의 일부일뿐입니다. 당신이 생각하는 것은 경로 MTU, 완전한 운송 경로에 대한 최소 MTU입니다. http://en.wikipedia.org/wiki/Path_MTU_Discovery 따라서 모든 관련 구성 요소의 모든 MTU를 알아야합니다. 이것은 문제가 될 수 있습니다. 예를 들어 점보 프레임과 스위치를 사용하지 않는 경우 스위치가 프레임을 분리해야합니다. 나는 스위치가 점보 프레임을 이해하지 못하고 프레임을 떨어 뜨린 문제가 이미 있었다.

이제 가장 흥미로운 질문 인 최적의 블록 크기입니다. 많은 파이썬 함수는 blocksize 나 chunkksize와 같은 인수를 취합니다. 그러나 기본 전송 프로토콜의 블록 크기를 처리하지는 못합니다. 블록 크기는 보내기/읽기 할 데이터가 들어있는 읽기 버퍼를 정의합니다. ftplib의 표준 크기는 8K (8192 바이트)입니다. 따라서 블록 크기를 조정하면 전송 속도에 영향을 미치지 않습니다.

기본 전송 프로토콜의 MTU 제어는 운영 체제와 해당 커널에서 처리 할 내용입니다.

마지막으로 ftp에 대한 몇 가지 단어입니다. ftp는 설정하기 쉽고 사용하기 쉬운 오래된 공룡이지만 항상 파일을 전송하는 가장 좋은 방법은 아닙니다. 특히 작은 파일을 많이 옮기는 경우. 나는 정확하게 당신의 유스 케이스를 모른다. 그러므로 rsync 나 bbcp와 같은 다른 전송 프로토콜 대안을 생각하는 것이 합리적 일 수있다. 나중에 복사 속도가 급격히 증가하는 것 같습니다. 당신은 정말 HTTP (I/O는 I/O를, [커널이 당신을 위해의주의를 기울여야한다] 디스크보다 느립니다 ... 네트워크만큼