Обратное мультиплексирование для ускорения передачи файлов

Я отправляю большое количество данных с одной машины на другую. Если я отправлю с помощью rsync (или любым другим способом), он будет работать с постоянной скоростью 320 кбит / с. Если я инициирую две или три передачи одновременно, каждый из них будет равен 320, и если я сделаю четыре раза, они будут максимально удалены по ссылке.

Мне нужно иметь возможность отправлять данные как можно быстрее, поэтому мне нужен инструмент, который может выполнять обратное мультиплексирование с переносом файлов. Мне нужно общее решение, поэтому запуск раскола на исходной машине и объединение их друг с другом на другом конце нецелесообразно. Мне нужно это, чтобы работать в автоматическом режиме.

Есть ли инструмент, который делает это, или мне нужно сделать свой собственный? Отправитель CentOS, приемник – FreeBSD.

11 Solutions collect form web for “Обратное мультиплексирование для ускорения передачи файлов”

Доказательство все это добавляет – я представляю «святой грааль» удаленных команд зеркала. Благодаря давру для предложения lftp .

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

Вышеуказанное будет рекурсивно отражать удаленный каталог, разбивая каждый файл на 10 потоков при его передаче!

Есть несколько инструментов, которые могут работать.

  • LFTP – поддерживает FTP, HTTP и SFTP. Поддержка нескольких подключений для загрузки одного файла. Предполагая, что вы хотите перенести файл с удаленного сервера на локальный сервер, установите LFTP на localServer и выполните:

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

    «-n 4» – сколько соединений используется параллельно.

  • Тогда есть множество инструментов «ускорителя загрузки», но они, как правило, поддерживают только HTTP или FTP, которые вы, возможно, не захотите настраивать на удаленном сервере. Некоторые примеры: Axel , aria2 и ProZilla

Если у вас несколько и больших файлов, используйте lftp -e 'mirror --parallel=2 --use-pget-n=10 <remote_dir> <local_dir>' <ftp_server> : вы будете скачивать 2 файла с каждым файлом, разбитым на 10 сегментов С общим подключением 20 ftp к <ftp_server> ;

Если у вас большое количество небольших файлов, используйте lftp -e 'mirror --parallel=100 <remote_dir> <local_dir>' <ftp_server> : вы будете загружать 100 файлов параллельно без сегментации. Будет открыто 100 соединений. Это может привести к тому, что доступные клиенты будут недоступны на сервере или могут быть заблокированы на некоторых серверах.

Вы можете использовать – --continue чтобы возобновить работу 🙂 и параметр -R для загрузки вместо загрузки (затем переключить порядок аргументов на <local_dir> <remote_dir> ).

Как структурируются ваши данные? Несколько больших файлов? Несколько больших каталогов? Вы можете создать несколько экземпляров rsync для определенных ветвей дерева каталогов.

Все зависит от того, как структурированы ваши исходные данные. Есть тонны инструментов unix для фрагментов, кубиков и сборки файлов.

Вы можете настроить свои настройки TCP, чтобы избежать этой проблемы, в зависимости от того, что вызывает ограничение 320 Кбит / с на соединение. Я предполагаю, что провайдер ISP не ограничивает скорость передачи на один канал. Есть два возможных виновника дросселирования:

  1. Некоторая связь между этими двумя машинами является насыщенной и падающей.
  2. Окна TCP насыщены, потому что продукт задержки полосы пропускания слишком велик.

В первом случае каждое TCP-соединение эффективно конкурировало бы в стандартном управлении перегрузкой TCP. Вы также можете улучшить это, изменив алгоритмы управления перегрузкой или уменьшив количество отсрочек.

Во втором случае вы не ограничены потерей пакетов. Добавление дополнительных подключений – грубый способ расширения общего размера окна. Если вы можете увеличить размер окна вручную, проблема исчезнет. (Это может потребовать масштабирования окна TCP, если задержка соединения достаточно высока.)

Вы можете приблизительно рассказать о том, насколько большим должно быть окно, умножая время «пинга» в оба конца на общую скорость соединения. 1280 КБ / с требуется 1280 (1311 для 1024 = 1 КБ) байтов за миллисекунду в оба конца. Буфер на 64 КБ будет превышен с задержкой в ​​50 мс, что довольно типично. Буфер 16 КБ затем насытится примерно на 320 КБ / с.

Если вы можете установить пароль для входа в систему без пароля, то это откроет 4 одновременных подключения scp (-n), при каждом подключении 4 файла (-L):

найти . -тип f | Xargs -L 4 -n 4 /tmp/scp.sh user @ host: путь

Файл /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 & 

Попробуйте отсортировать все файлы на inode (find / mydir -type f -print | xargs ls -i | sort -n) и перенести их, например, cpio over ssh. Это позволит вам полностью освободить ваш диск и сделать сеть узким местом. Быстрее, чем трудно, когда вы пересекаете сеть.

Я знаю инструмент, который может передавать файлы в куски. Этот инструмент называется пакетом / портом rtorrent, который доступен на обоих хостах;) Клиенты BitTorrent часто резервируют дисковое пространство перед передачей, а куски записываются непосредственно из сокетов на диск. Кроме того, вы сможете просмотреть все состояния трансферов в хорошем экране ncurses.

Вы можете создавать простые скрипты bash для автоматизации создания файла «* .torrent» и команды ssh на удаленную машину, чтобы она загружала ее. Это выглядит немного уродливо, но я не думаю, что вы найдете какое-то простое решение, не развивая 🙂

FTP использует несколько подключений для загрузки. Если вы можете настроить безопасный канал для FTP через VPN или FTP через SSH , вы должны иметь возможность максимизировать свою сетевую ссылку. (Обратите внимание, что для FTP через SSH требуются особые соображения – см. Ссылку.)

FTPS (FTP через SSL) также может делать то, что вам нужно.

Вы также можете использовать SFTP-клиент, который поддерживает несколько подключений, но я не уверен, поддерживает ли SFTP несколько подключений для одного файла. Это должно делать то, что вам нужно большую часть времени, но не может обеспечить максимальную пропускную способность, когда вам нужно передать только один большой файл.

Решение 1. Я не уверен, насколько это практично в вашем случае, но вы можете создать растянутый архив (например, tarfile, разбитый на куски или запаленный архив 7zip), а затем использовать несколько экземпляров rsync для их отправки Сети и собрать / извлечь их с другой стороны. Вы можете написать универсальный скрипт, аргументы которого должны быть переданы в каталог, а также количество подключений. Очевидным недостатком является то, что вам понадобится вдвое больше свободного места с обеих сторон и будет иметь дополнительные накладные расходы на архивирование / извлечение файлов на обоих концах.

Решение 2. Лучшим решением было бы написать скрипт или программу, которая делит большое дерево каталогов на поддеревья на основе размера, а затем копирует эти поддеревья параллельно. Это может упростить, если вы сначала скопируете всю структуру каталогов (без файлов).

Вы используете две машины в надежной среде? Вы можете попробовать 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 есть хорошая страница примеров .

  • Отобразить свободное пространство файловой системы для пользователя root
  • Как запретить пользователям sudo запускать определенные команды?
  • Удаление файлов не освобождает место
  • Известные проблемы с двойной загрузкой Windows 8 и Fedora 17
  • Как защитить пароль .tgz-файла с помощью tar в Unix?
  • Как я могу получить информацию о файлах «меньше», например, с «человеком»?
  • Есть ли способ отображения таймера обратного отсчета или секундомера в терминале?
  • Не удалось перенаправить журнал в / var / log / syslog
  • Установка R в RHEL 7
  • Как цветной вывод grep
  • Как позволить утилите `man` использовать` less` для отображения руководства, а не `more`?
  • Давайте будем гением компьютера.