Я пытаюсь скопировать пакет файлов, scp
но это очень медленно. Это пример с 10 файлами:
$ time scp cap_* user@host:~/dir
cap_20151023T113018_704979707.png 100% 413KB 413.2KB/s 00:00
cap_20151023T113019_999990226.png 100% 413KB 412.6KB/s 00:00
cap_20151023T113020_649251955.png 100% 417KB 416.8KB/s 00:00
cap_20151023T113021_284028464.png 100% 417KB 416.8KB/s 00:00
cap_20151023T113021_927950468.png 100% 413KB 413.0KB/s 00:00
cap_20151023T113022_567641507.png 100% 413KB 413.1KB/s 00:00
cap_20151023T113023_203534753.png 100% 414KB 413.5KB/s 00:00
cap_20151023T113023_855350640.png 100% 412KB 411.7KB/s 00:00
cap_20151023T113024_496387641.png 100% 412KB 412.3KB/s 00:00
cap_20151023T113025_138012848.png 100% 414KB 413.8KB/s 00:00
cap_20151023T113025_778042791.png 100% 413KB 413.4KB/s 00:00
real 0m43.932s
user 0m0.074s
sys 0m0.030s
Странно то, что скорость передачи составляет около 413 КБ / с, а размер файла - около 413 КБ, поэтому на самом деле он должен передавать один файл в секунду, однако на файл уходит около 4,3 секунды.
Любая идея, откуда эти издержки, и есть ли способ сделать это быстрее?
scp
time
batch-jobs
Laurent
источник
источник
Ответы:
Комментарий @ wurtel, вероятно, верен: установка каждого соединения требует много времени. Если вы можете это исправить, вы получите более быстрые переводы (и если вы не можете, просто используйте обходной
rsync
путь @ roaima ). Я провел эксперимент по передаче файлов одинакового размера (head -c 417K /dev/urandom > foo.1
и сделал несколько копий этого файла) на хост, который требует времени для подключения (HOST4) и тот, который очень быстро отвечает (HOST1):источник
Вы можете использовать
rsync
(overssh
), который использует одно соединение для передачи всех исходных файлов.Если у вас нет
rsync
(и почему не !?) , вы можете использоватьtar
сssh
подобным образом, что позволяет избежать создания временного файла:Это
rsync
должно быть предпочтительным, при прочих равных условиях, потому что он перезапускается в случае прерывания.источник
scp
вызов не будет использовать одно соединение для передачи всех файлов?f -
каждой стороне, так как tar выводит / читает из stdout / stdin по умолчанию. Такtar cz cap_* | ssh user@host tar xvzC dir
бы и сделал.tar
может быть скомпилирован с другими значениями по умолчанию (посмотрите, используетеtar --show-defaults
ли вы GNU tar или/etc/default/tar
иным образом, и в обоих случаях не забудьтеTAPE
переменную окружения)scp
это создаст новое соединение для каждого файла, но, вспомнив - и после двойной проверкиtshark
- я понял, что я ошибался. На данный момент я больше не уверен, почему ОПscp
должны так долго занимать файл.Это переговоры о передаче, которая требует времени. В целом, операции по п файлов б байт каждый занимает намного больше времени , чем одной операции на одном файле п * б байт. Это также верно, например, для дискового ввода-вывода.
Если вы посмотрите внимательно, вы увидите, что скорость передачи в этом случае равна size_of_the_file / secs.
Для более эффективной передачи файлов объедините их вместе
tar
, а затем передайте архив:tar cvf myarchive.tar cap_20151023T*.png
или, если вы также хотите сжать архив,
tar cvzf myarchive.tar.gz myfile*
Сжатие или нет, зависит от содержимого файла, например. если это JPEG или PNG, сжатие не будет иметь никакого эффекта.
источник
-z
tar
обычно выполняется второй проход для сжатия, или если это будет сжатие и архивирование одновременно-z
ограничением процессора и намного медленнее. gzip всегда будет пытаться сжать, отсюда и замедление; в конце концов, вы не можете сказать, является ли строка байтов сжимаемой, пока вы не попытались сжать ее. В моем случае, даже при передаче простых текстовых файлов, rsync без сжатия является самым быстрым в 2-3 раза по сравнению с самым легким сжатием. Конечно, YMMV.Другая причина того, что scp медленнее, чем должно быть, особенно в сетях с высокой пропускной способностью, заключается в том, что он статически определяет внутренние буферы управления потоками, которые в конечном итоге становятся узкими местами производительности сети.
HPN-SSH - это исправленная версия OpenSSH, которая увеличивает размер этих буферов. Это имеет огромное значение для скорости передачи scp (см. Графики на сайте, но я также говорю из личного опыта). Конечно, чтобы получить преимущества, вам нужно установить HPN-SSH на все ваши хосты, но это того стоит, если вам регулярно приходится передавать большие файлы.
источник
Я использовал описанную здесь технику, которая использует параллельные gzip и netcat для быстрого сжатия и копирования данных.
Это сводится к:
Это использует tar, чтобы собрать файл или файлы. Затем использует pigz, чтобы получить множество потоков процессора для сжатия и отправки файла, передача по сети осуществляется с помощью netcat. На принимающей стороне netcat прослушивает, затем распаковывает (параллельно) и разархивирует.
источник
nc
не зашифрованssh -D
Может быть, добавить немного магии?Только что эта проблема была связана с передачей больших файлов mp4 между сайтами
scp
. Получал ~ 250 КБ / с. После отключения защиты от наводнений UDP (FP) на брандмауэре назначения скорость передачи увеличилась до 6,5 МБ / с. При повторном включении FP скорость упала до ~ 250 КБ / с.Отправитель: cygwin, Получатель: Fedora 20, Firewall Sophos UTM.
Для чего SSH использует UDP? @ superuser.com - Это не прямо из того, что я прочитал.
При просмотре журнала брандмауэра обнаружение флуда происходило как на портах источника, так и на портах 4500 по общедоступным IP-адресам, а не по частным внутренним VPN-адресам. Так что, похоже, моя проблема, скорее всего, в ситуации NAT Traversal, когда
scp
данные TCP в конечном итоге зашифрованы и инкапсулированы в пакеты ESP и UDP, и, следовательно, подчиняются FP. Чтобы удалитьscp
из уравнения, я запустил операцию копирования файлов Windows через VPN и заметил, что производительность схожаscp
с включенной и отключенной FP. Также запустилiperf
тест по TCP и заметил 2 Мбит / с с FP и 55 Мбит / с без.Как NAT-T работает с IPSec? @ cisco.com
источник