2014-07-11 26 views
12

Tôi đang sử dụng ftplib của python để chuyển rất nhiều và nhiều dữ liệu (~ 100 tệp X 2GB) trên mạng cục bộ sang máy chủ FTP. Mã này đang chạy trên Ubuntu. Đây là cuộc gọi của tôi (tự là đối tượng FtpClient của tôi, là một gói bao quanh khách hàng ftplib):Python ftplib Kích thước khối tối ưu?

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

Câu hỏi của tôi là, làm cách nào để chọn kích thước khối tối ưu? Sự hiểu biết của tôi là kích thước khối tối ưu phụ thuộc vào một số thứ, không ít nhất là tốc độ kết nối và độ trễ. Mã của tôi sẽ chạy trên nhiều mạng khác nhau với tốc độ khác nhau và lượng tắc nghẽn khác nhau trong ngày. Lý tưởng nhất, tôi muốn tính toán kích thước khối tối ưu trong thời gian chạy.

Kích thước khối truyền tối ưu FTP có giống với kích thước cửa sổ TCP tối ưu không? Nếu điều này là đúng, và quy mô cửa sổ TCP được bật, có cách nào để có được kích thước cửa sổ TCP tối ưu từ hạt nhân không? Hạt nhân Linux xác định/tối ưu khi nào xác định kích thước cửa sổ tối ưu? Lý tưởng nhất là tôi có thể hỏi hạt nhân Linux cho kích thước khối tối ưu, để tránh tái phát minh bánh xe.

+0

Chừng mạng I/O là chậm hơn so với đĩa i/o, [kernel nên chăm sóc điều đó cho bạn] (http : //en.wikipedia.org/wiki/Nagle%27s_algorithm). Bạn cũng có thể xem xét để đặt tùy chọn 'TCP_CORK'. – Phillip

+0

Bạn đang mong đợi hoặc sử dụng loại đồng thời nào ở đây? Đây có phải là ứng dụng đơn luồng không? Bạn có thể hưởng lợi từ I/O không đồng bộ ghép kênh không? –

Trả lời

7

đây là một câu hỏi thú vị và tôi đã phải lặn trong một chút sâu hơn;)

Dù sao, đây là một ví dụ điển hình như thế nào để xác định MTU: http://erlerobotics.gitbooks.io/erle-robotics-python-gitbook-free/content/udp_and_tcp/udp_fragmentation.html

Tuy nhiên, bạn cũng nên suy nghĩ về sau đây: MTU là cái gì đó là một hiện tượng địa phương và có thể chỉ liên quan đến một phần của mạng nội bộ của bạn. Những gì bạn nghĩ về là MTU đường dẫn, MTU tối thiểu trên con đường vận chuyển hoàn chỉnh. http://en.wikipedia.org/wiki/Path_MTU_Discovery Vì vậy, bạn sẽ phải biết mọi MTU của mọi thành phần liên quan. Đây có thể là một vấn đề, ví dụ nếu bạn đang sử dụng khung Jumbo và một công tắc không, công tắc phải tách các khung hình. Tôi đã có vấn đề là một công tắc không hiểu khung jumbo và bỏ khung.

Bây giờ câu hỏi thú vị nhất: khối tối ưu hóa. Rất nhiều chức năng python lấy các đối số như khối hoặc khối. Nhưng họ không giải quyết các khối của giao thức vận tải cơ bản. Blockize định nghĩa một bộ đệm đọc sẽ chứa dữ liệu được gửi/đọc. Kích thước chuẩn trong ftplib là 8K (8192 byte). Vì vậy, việc điều chỉnh các khối không nên thực sự ảnh hưởng đến tốc độ truyền tải.

Kiểm soát MTU của giao thức truyền tải cơ bản là một thứ sẽ được xử lý bởi hệ điều hành và hạt nhân của nó.

Cuối cùng là một số từ về ftp. ftp là một con khủng long cũ rất dễ cài đặt và sử dụng nhưng cũng không phải lúc nào cũng là phương pháp tốt nhất để truyền tệp. Đặc biệt là nếu bạn chuyển nhiều tệp nhỏ. Tôi không biết chính xác trường hợp sử dụng của bạn, do đó, suy nghĩ về các lựa chọn giao thức chuyển giao khác như rsync hoặc bbcp có thể có ý nghĩa. Sau này dường như tăng tốc độ sao chép mạnh. Bạn thực sự cần có một cái nhìn tại http://moo.nac.uci.edu/~hjm/HOWTO_move_data.html

chỉ của tôi hai xu ...

Các vấn đề liên quan