Оптимальный размер блока Python ftplib?

Я использую python ftplib для передачи множества и большого количества данных (~ 100 файлов X 2 ГБ) через локальную сеть на FTP-сервер. Этот код работает на Ubuntu. Вот мой вызов (self - мой объект FtpClient, который является оберткой вокруг клиента ftplib):

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

Мой вопрос: как выбрать оптимальный размер блока? Мое понимание заключается в том, что оптимальный размер блока зависит от ряда факторов, не в последнюю очередь от скорости соединения и задержки. Мой код будет работать во многих разных сетях с разной скоростью и разным количеством перегрузок в течение дня. В идеале я хотел бы вычислить оптимальный размер блока во время выполнения.

Будет ли оптимальный размер блока передачи FTP таким же, как размер оптимального размера TCP? Если это так, и масштабирование окна TCP включено, есть ли способ получить оптимальный размер окна TCP из ядра? Как/когда ядро ​​linux определяет оптимальный размер окна? В идеале я мог бы спросить ядро ​​linux для оптимального размера блока, чтобы избежать повторного использования колеса.

Ответ 1

Это интересный вопрос, и я должен был погрузиться немного глубже;)

В любом случае, вот хороший пример, как определить MTU: http://erlerobotics.gitbooks.io/erle-robotics-python-gitbook-free/content/udp_and_tcp/udp_fragmentation.html

Но вы должны также подумать о следующем: MTU - это то, что является локальным явлением и, возможно, касается только части вашей локальной сети. Что вы думаете о MTU пути, минимальном MTU по всему пути транспорта. http://en.wikipedia.org/wiki/Path_MTU_Discovery Таким образом, вам нужно знать каждый MTU каждого задействованного компонента. Это может быть проблемой, например, если вы используете Jumbo Frames и переключатель нет, коммутатор должен разделить кадры. У меня уже была проблема, что коммутатор не понял jumbo-кадров и сбросил кадры.

Теперь самый интересный вопрос: оптимальный размер. Многие функции python принимают такие аргументы, как blockize или chunksize. Но они не учитывают блокировку базового транспортного протокола. Blockize определяет буфер чтения, который будет содержать данные для отправки/чтения. Стандартный размер в ftplib составляет 8K (8192 байта). Таким образом, настройка блока не должна влиять на скорость передачи.

Управление MTU базового транспортного протокола - это то, что будет обрабатываться операционной системой и ее ядром.

Наконец, некоторые слова о ftp. ftp - старый динозавр, который легко настроить и использовать, но также не всегда лучший способ передачи файлов. Особенно, если вы переносите много мелких файлов. Я не знаю точно вашего варианта использования, поэтому думать о других альтернативах протокола передачи, таких как rsync или bbcp, может иметь смысл. Позже, по-видимому, скорость копирования резко возрастает. Вы действительно должны взглянуть на http://moo.nac.uci.edu/~hjm/HOWTO_move_data.html

мои два цента...