Я пытаюсь передать около 100 тыс. файлов общим объемом 90 ГБ. Сейчас я использую rsync daemon, но он медленный — 3,4 Мбит/с, и мне нужно сделать это несколько раз. Мне интересно, какие у меня есть варианты, которые бы максимально использовали 100 Мбит/с соединение через интернет и были бы очень надежными.
решение1
Вы рассматривалиSneakernet? При больших объемах данных ночная доставка часто оказывается быстрее и дешевле, чем передача через Интернет.
решение2
Как? Или TL;DR
Самый быстрый метод, который я нашел, — это комбинация tar
, mbuffer
и ssh
.
Например:
tar zcf - bigfile.m4p | mbuffer -s 1K -m 512 | ssh otherhost "tar zxf -"
Используя это, я добился устойчивой передачи данных по локальной сети со скоростью более 950 Мбит/с на 1Gb-линках. Замените пути в каждой команде tar на соответствующие тому, что вы передаете.
Почему? мбаффер!
Самым большим узким местом при передаче больших файлов по сети, безусловно, является дисковый ввод-вывод. Ответ на этот вопрос — mbuffer
или buffer
. Они во многом похожи, но mbuffer
имеют некоторые преимущества. Размер буфера по умолчанию составляет 2 МБ для mbuffer
и 1 МБ для buffer
. Более крупные буферы, скорее всего, никогда не будут пустыми. Выбор размера блока, который является наименьшим общим кратным собственного размера блока как в целевой, так и в целевой файловой системе, даст лучшую производительность.
Буферизация — это то, что делаетвсеразница!Используйте его, если он у вас есть! Если у вас его нет, купите его! Использование (m}?buffer
плюса чего-либо лучше, чем чего-либо по отдельности. Это буквально панацея от медленной передачи файлов по сети.
Если вы передаете несколько файлов, используйте tar
"объединение" их в один поток данных. Если это один файл, вы можете использовать cat
или перенаправление ввода-вывода. Накладные расходы tar
vs. cat
статистически незначительны, поэтому я всегда использую tar
(или zfs -send
где могу), если только это уже нетарболл. Ни один из них не гарантирует, что вы получите метаданные (и в частности cat
не получит). Если вам нужны метаданные, я оставлю это вам в качестве упражнения.
Наконец, использование ssh
для транспортного механизма является как безопасным, так и несет очень мало накладных расходов. Опять же, накладные расходы ssh
vs. nc
статистически незначимы.
решение3
Вы упомянули «rsync», поэтому я предполагаю, что вы используете Linux:
Почему бы вам не создать файл tar или tar.gz? Время передачи по сети одного большого файла быстрее, чем многих маленьких. Вы даже можете сжать его, если захотите...
Тар без сжатия:
На исходном сервере:
tar -cf file.tar /path/to/files/
Затем на принимающей стороне:
cd /path/to/files/
tar -xf /path/to/file.tar
Тар с компрессией:
На исходном сервере:
tar -czf file.tar.gz /path/to/files/
Затем на принимающей стороне:
cd /path/to/files/
tar -xzf /path/to/file.tar.gz
Вам просто нужно использовать rsync для фактической передачи файлов (tar|tar.gz).
решение4
Вы можете использовать различные параметры сжатия rsync.
-z, --compress compress file data during the transfer
--compress-level=NUM explicitly set compression level
--skip-compress=LIST skip compressing files with suffix in LIST
Степень сжатия двоичных файлов очень низкая, поэтому вы можете пропустить эти файлы, используя --skip-compress, например iso, уже заархивированные и сжатые tar-файлы и т. д.