Ответ @ pdo хорош, но можно увеличить скорость с помощью буфера и хорошего сжатия и добавить индикатор выполнения.
Часто узким местом является сеть, и скорость меняется со временем. Следовательно, это помогает буферизовать данные перед их отправкой по сети. Это можно сделать с помощью pv
.
Кроме того, обычно можно увеличить скорость с надлежащим алгоритмом сжатия. Gzip (как использовалось выше) - это алгоритм быстрого сжатия, но в целом zstandard ( zstd
) (и для высоких коэффициентов сжатия LZMA / LZMA2 ( xz
) будут сжиматься лучше и быстрее одновременно. Новые xz и zstd уже имеют встроенную поддержку многоядерных процессоров). Для использования gzip с несколькими ядрами можно использовать pigz.
Вот пример отправки данных с индикатором выполнения, буферизацией и zstandard сжатием по сети:
tar cf - . | pv -perabs $(du -sk . | cut -f 1)K | zstd -14 --long=31 -T0 | pv -qCB 512M | ssh user@host "cd /wherever && pv -qCB 512M | zstd -cd -T0 --long=31 | tar xf -"
Первый pv
- показать прогресс ( p ), расчетное время ( e ), скорость передачи ( r ), среднюю скорость ( a ), общее количество переданных байтов ( b ). Общий размер оценивается с du
и добавляется к выбору размера ( ов ). Прогресс измеряется до сжатия и буферизации, поэтому он не очень точен, но все же полезен.
zstd
используется с настройкой сжатия 14 . Это число может быть уменьшено или увеличено в зависимости от скорости сети и процессора, поэтому zstd немного быстрее скорости сети. С четырьмя ядрами на процессоре Haswell 3,2 ГГц 14 обеспечивает скорость около 120 МБ / с. В этом примере используется длинный режим 31 (используется окно размером 2 ГБ, требуется много оперативной памяти, но он очень хорош, например, для сжатия дампов базы данных). В T0 опция устанавливает количество нитей к количеству ядер. Следует помнить, что вместе с длинным режимом эти настройки используют много памяти.
Проблема с zstd заключается в том, что большинство операционных систем не поставляются с версией> = 1.3.4. Эта версия необходима для правильной многоядерности и длительной поддержки. Если он недоступен, его можно скомпилировать и установить с https://github.com/facebook/zstd с помощью just make -j4 && sudo make install
. Вместо zstd можно также использовать xz или pigz. xz медленный, но сжимается очень хорошо (хорошо по сравнению с медленными соединениями), pigz / gzip быстр, но сжимается не очень хорошо.
pv
затем используется снова, но для буферизации ( q
для тишины, C
для режима без склейки [всегда необходим для буферизации] и B
для установки размера буфера).
В этом примере буфер также используется на стороне получателя. Это часто не нужно (поскольку скорость распаковки и записи на жесткий диск в большинстве случаев выше, чем скорость сети), но обычно также не наносит вреда.