Быстрый способ скопировать большой файл на LAN

Все, в чем Вы нуждаетесь:

VMname=$(./vmrun list)
snapshotList=$(./vmrun listSnapshots "$VMname")

Если Вам не нужна промежуточная переменная VMname, можно также использовать:

snapshotList=$(./vmrun listSnapshots "$(./vmrun list)")

Использовать $() вместо `` (если Вы не используете очень старую оболочку, которая не понимает первого). Вложение $() конструкции легче.

24
19.09.2012, 00:58
3 ответа

Быстрый путь

Самый быстрый способ передать файлы по LAN вероятен не rsync, если нет немного изменений. rsync проводит немного времени, делая контрольные суммы, вычисляя различия, и т.д. Если Вы знаете, что собираетесь быть передачей большинства данных так или иначе, просто сделайте что-то вроде этого (примечание: существует несколько реализаций netcat; проверьте руководство на корректные опции. В частности, Ваш не мог бы хотеть -p):

user@dest:/target$ nc -q 1 -l -p 1234 | tar xv

user@source:/source$ tar cv . | nc -q 1 dest-ip 1234

Это использует netcat (nc) отправить tar по необработанному соединению TCP на порте 1234. Нет никакого шифрования, проверки подлинности, и т.д., таким образом, его очень быстрое. Если Ваше кросс-соединение будет работать на уровне гигабита или меньше, то Вы привяжете сеть; если больше, Вы привяжете диск (если у Вас не будет массива хранения данных или быстрого диска). v флаги к tar заставляют его распечатать имена файлов, когда это идет (подробный режим). С большими файлами это не практически никакие издержки. При выполнении тонн маленьких файлов Вы выключили бы это. Кроме того, можно вставить что-то как pv в конвейер для получения индикатора хода выполнения:

user@dest:/target$ nc -q 1 -l -p 1234 | pv -pterb -s 100G | tar xv

Можно, конечно, вставить другие вещи также, как gzip -1 (и добавьте z флаг на принимающем конце — z флаг на передающем конце использовал бы более высокий уровень сжатия, чем 1, если Вы не устанавливаете переменную среды GZIP, конечно). Хотя gzip, вероятно, на самом деле будет медленнее, если Ваши данные действительно не сожмутся.

Если Вам действительно нужен rsync

Если Вы действительно только передаете небольшую часть данных, которые изменились, rsync может быть быстрее. Можно также хотеть посмотреть на -W/--whole-file опция, как с действительно быстрой сетью (как кросс-соединение), который может быть быстрее.

Самый легкий способ выполнить rsync по ssh. Вы захотите экспериментировать с ssh шифрами для наблюдения, который является самым быстрым, это будет или AES, ChaCha20 или Шифр (хотя существуют некоторые проблемы безопасности с 64-разрядным размером блока Шифров), в зависимости от того, если микросхема имеет инструкции AES-NI Intel (и OpenSSL использует их). На достаточно новом ssh rsync-over-ssh похож на это:

user@source:~$ rsync -e 'ssh -c aes128-gcm@openssh.com' -avP /source/ user@dest-ip:/target

Для более старого ssh/sshd попробовать aes128-ctr или aes128-cbc вместо aes128-gcm@openssh.com.

ChaCha20 был бы chacha20-poly1305@openssh.com (также нуждается в достаточно новом ssh/sshd), и Шифр был бы CBC шифра. OpenSSH не позволяет работать без шифра. Можно, конечно, использовать, какой бы ни rsync опции Вам нравится вместо -avP. И конечно можно пойти другое направление и выполнить rsync от целевой машины (получение по запросу) вместо исходной машины (нажатие).

Создание rsync быстрее

При выполнении rsync демона можно избавиться от crypto наверху. Во-первых, Вы создали бы конфигурационный файл демона (/etc/rsyncd.conf), например, на исходной машине (читает rsyncd.conf страницу справочника для деталей):

[big-archive]
    path = /source
    read only = yes
    uid = someuser
    gid = somegroup

Затем на целевой машине Вы работали:

user@dest:~$ rsync -avP source-ip::big-archive/ /target

Можно сделать это наоборот также (но конечно необходимо будет установить только для чтения на не). Существуют опции для аутентификации, и т.д., проверьте страницу справочника на детали.

43
27.01.2020, 19:40
  • 1
    Это - превосходный ответ. Другой является большим также. Там не принят ответ просто, потому что автор вопроса не может выбрать между ними? –  sudo 14.01.2016, 02:47
  • 2
    Насколько устойчивый netcat подход? Если сеть отбрасывает пакеты, кажется, что это потеряет случайные части файлов. –  sudo 16.01.2016, 01:33
  • 3
    @sudo это использует TCP, который ретранслирует по мере необходимости. Таким образом, это должно быть прекрасным против потери пакетов, случайного повреждения (до степени, TCP и контрольные суммы Ethernet ловят его), и т.д. Конечно, это не безопасно против нападения как туннелирование по ssh. –  derobert 16.01.2016, 01:36
  • 4
    @sudo можно сделать все это сразу, ввести некоторых tee команды в канал с обеих сторон для вычислений контрольных сумм. –  derobert 16.01.2016, 01:54
  • 5
    @TheStoryCoder точка в tar часть говорит этому делать текущий каталог. Это не на самом деле часть nc команда, tar используется для создания архива tar, который передается по каналу в к netcat (и с другой стороны, netcat передается по каналу в к tar для извлечения архива). Я боюсь, что комментарий не действительно достаточен для объяснения каналов, но надо надеяться этого достаточно для запущения Вас... –  derobert 23.03.2018, 10:36

Как? Или TL; DR

Самый быстрый метод, который я нашел, является комбинацией tar, mbuffer и ssh.

Например:

tar zcf - bigfile.m4p | mbuffer -s 1K -m 512 | ssh otherhost "tar zxf -"

Используя это я достиг поддержанных передач локальной сети более чем 950 Мбит/с на ссылках на 1 ГБ. Замените пути в каждой команде tar для подхожения для того, что Вы передаете.

Почему? mbuffer!

Самое большое узкое место в передаче больших файлов по сети является, безусловно, диском ввод-вывод. Ответ на это mbuffer или buffer. Они в основном подобны, но mbuffer имеет некоторые преимущества. Размер буфера по умолчанию составляет 2 МБ для mbuffer и 1 МБ для buffer. Более крупные буферы, более вероятно, никогда не будут пусты. Выбор размера блока, который является наименьшим общим кратным собственного размера блока и в целевой и в целевой файловой системе, даст лучшую производительность.

Буферизация является вещью, которая имеет все значение! Используйте его, если у Вас есть он! Если Вы не имеете его, получаете его! Используя (m}?buffer плюс что-либо лучше, чем что-нибудь отдельно. это - почти буквально панацея для медленных передач сетевого файла.

Если Вы передаете несколько использования файлов tar "смешать" их в единственный поток данных. Если это - единственный файл, можно использовать cat или перенаправление ввода-вывода. Издержки tar по сравнению с. cat статистически незначительно, таким образом, я всегда использую tar (или zfs -send где я могу), если это уже не tarball. Ни один из них, как не гарантируют, даст Вам метаданные (и в особенности cat не будет). Если Вы захотите метаданные, то я оставлю это как осуществление для Вас.

Наконец, использование ssh поскольку транспортный механизм и безопасен и несет очень мало служебное. Снова, издержки ssh по сравнению с. nc статистически незначительно.

17
27.01.2020, 19:40
  • 1
    openssl speed на i7-3770 дает ~126-146 МБ/с для шифра CBC, и ~138-157 МБ/с для AES CBC (эта микросхема имеет инструкции AES-NI). Затем ~200-300 МБ/с для sha256. Таким образом, это может едва-едва продвинуть 1 гигабит. С OpenSSH 6.1 +, Вы могли использовать AES GCM, который это может сделать при ослеплении уровней (370-1320 МБ/с, в зависимости от размера сообщения). Таким образом, я думаю ее единственное истинное, что OpenSSH имеет мало служебное, если Вы выполняете 6.1 + на микросхеме с AES-NI и используете AES-GCM. –  derobert 12.11.2013, 17:27
  • 2
    Тьфу, я изменил это на 6,1 + вместо 6,2 + в последнюю минуту, быстро перепроверив. Конечно, это было ошибкой, это - изменения с тех пор 6.1. Таким образом, OpenSSH 6.2 + является правильной версией. И это не позволит мне отредактировать комментарий больше теперь. Комментарии, более старые, чем 5 минут, должны остаться неправильными. Конечно, если меньше, чем OpenSSH 6.4, см. openssh.com/txt/gcmrekey.adv как без патча, в реализации AES-GCM OpenSSH был годный для использования дефект. –  derobert 12.11.2013, 17:34
  • 3
    Издержки для ssh (или rsync по ssh), очень, ОЧЕНЬ важен. У меня есть NAS, который использует ЦП Intel Atom. Шифрование SSH АБСОЛЮТНО ЗАПРАВЛЯЕТ скорость передачи. Я последовательно добираюсь <400 Мбит/с для RSA, вручную переопределяя его к RC4 получают меня ~600 Мбит/с, и если я использую rsync в качестве демона, это работает на собственной скорости ссылки (> 900 Мбит/с на гигабитном соединении). –  Fake Name 24.10.2014, 11:20
  • 4
    В то время как это верно, что для многих ситуаций, транспорт не очень важен, абсолютно важно рассмотреть это, особенно если Вы не работаете на чрезвычайно высокопроизводительных аппаратных средствах. В моем случае Atom (это - D525, двухъядерные 1,8 ГГц) делает для абсолютно прекрасного NAS с большим количеством скорости для SMB, но шифрование абсолютно уничтожает его. –  Fake Name 24.10.2014, 11:22
  • 5
    я получаю фатальную ошибку из-за параметризации mbuffer: 'mbuffer: фатальный: общая память должна быть более крупной, чем размер блока \n Завершенный'. Для исправления я подозреваю, что это должно считать что-то как 'mbuffer-s 1K-m 512M' с заключительным 'M', поддерживающим Мегабайт (источник: человек mbuffer) –  Peter Lustig 19.04.2015, 09:52

Вам даже не нужно использовать TCP. AoE - это реализация ATA через Ethernet, будучи уровнем 2, это подход с меньшими накладными расходами без знания стека TCP / IP. Это обеспечит максимально быструю передачу с наименьшими накладными расходами. ***

https://en.wikipedia.org/wiki/ATA_over_Ethernet

*** если сеть является узким местом, убедитесь, что вы отправляете сжатые данные.

1
27.01.2020, 19:40

Теги

Похожие вопросы