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

19

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

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

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

ZimmyDubZongyZongDubby
источник

Ответы:

29

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

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

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

Тим Вулфорд
источник
lftpотлично, но я не могу заставить его делать несколько частей при загрузке. Я использую mirror --use-pget-n=20 -R- но похоже, что --use-pget-nработает только при загрузке.
Дан
PS, -P20работает для загрузки нескольких файлов, но я не могу составить каждый файл.
Дан
1
lftp не поддерживает сегментированную / многочастную загрузку. Вы должны начать передачу со стороны назначения для использования pget -n.
apraetor
Помните, mirrorэто двунаправленный; pgetаргумент относится только к загрузке файлов.
apraetor
10

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

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

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

    «-N 4» - это количество подключений для параллельного использования.

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

Davr
источник
8

Если у вас есть несколько больших файлов, используйте 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>).

Марио Мело Филю
источник
1
опечатка в параметре: --use-pget-n вместо --use-pget-m. Пытался редактировать, но мое редактирование было коротким.
Тони
2

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

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

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

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

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

Капитан сегфо
источник
1

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

Все зависит от того, как структурированы ваши исходные данные. Существует множество инструментов Unix для нарезки, нарезания кубиков и повторной сборки файлов.

Джефф Фриц
источник
Произвольные данные. Иногда это большой каталог, иногда один файл.
ZimmyDubZongyZongDubby
1

Если вы можете настроить ssh-вход без пароля, то откроются 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 &
user67730
источник
0

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

Джимми Хедман
источник
это просто подлый :)
Уоррен
Я не могу гарантировать, что все файловые системы получат импульс от этого, это зависит от того, как выполняется разметка inode.
Джимми Хедман
Узким местом является то, что каждое TCP-соединение ограничено 320 КБ / с. Я хочу отправлять файлы в параллельных соединениях TCP, чтобы получить 320 * NumConnections до предела сети (около 1200 КБ / с). Сортировка по индоду не достигает этого.
ZimmyDubZongyZongDubby
Что ограничивает скорость TCP? Маршрутизатор между машинами?
Джимми Хедман
Мой провайдер Чистый нейтралитет? ХА!
ZimmyDubZongyZongDubby
0

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

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

kolypto
источник
1
Если в передаче файлов участвуют только две машины, как может помочь торрент? Идея торрента - это рой сеялок, делающих данные доступными для запрашивающего клиента.
DaveParillo
Ты прав. Но кто сказал, что бесполезно с одной сеялкой? ;)
Колыпто
2
Если торрент-клиент создает несколько соединений TCP с одним узлом, это решит проблему OP. Тем не менее, я не знаю, действительно ли торрент-клиенты создают несколько TCP-соединений с одним пирами.
Хронос
0

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

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

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

грабить
источник
Разве SFTP не будет намного проще и безопаснее (если не больше)?
Марк Ренуф
1
@rob: откуда вы взяли, что «FTP использует несколько соединений для передачи файлов»? Некоторые клиенты допускают загрузку с FTP нескольких потоков , но определенно отсутствует комбинация клиент / сервер FTP, позволяющая загружать несколько потоков на FTP.
Хронос
@Mark: Да, SFTP, вероятно, будет проще и в равной степени безопасным, но я не знаю, поддерживает ли он несколько соединений для передачи одного файла. Спасибо за предложение, хотя; Я добавлю это в список.
ограбить
1
@chronos: Извините, это не было ясно; Я предлагал ZimmyDubZongyZongDubby использовать FTP для загрузки с сервера CentOS на клиент FreeBSD. Я обновил ответ, чтобы конкретно сказать «загрузки» вместо «передачи файлов».
грабить
-1

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

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

грабить
источник
Кто-нибудь хочет уточнить на downvote?
ограбить
-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 имеет хорошую страницу с примерами .

DaveParillo
источник
Это похоже на общий ответ, который не отвечает на его вопрос. Я не вижу, как какое-либо из ваших решений будет передаваться параллельно, насколько я знаю, nc - это всего лишь одно соединение
davr
Вы можете быть правы, однако, используя nc, у вас есть контроль над открытыми портами. Вы можете указать 10000, если вы так склонны.
DaveParillo