Как сжать и передать папки от одного сервера до другого по сети

Концептуально, библиотечная функция является частью Вашего процесса.

Во времени выполнения Вашем исполняемом коде и коде любых библиотек (таких как libc.so) это зависит от, будьте связаны в единственный процесс. Так, когда Вы вызываете функцию в такой библиотеке, она выполняется как часть Вашего процесса с теми же ресурсами и полномочиями. Это - та же идея как вызывание функции, которую Вы записали сами (за возможными исключениями как PLT и/или функции батута, которые можно искать, если Вы заботитесь).

Концептуально, системный вызов является специальным интерфейсом, используемым для звонка из кода (который обычно непривилегирован) к ядру (который, имеет право нарастить полномочия по мере необходимости).


Например, посмотрите кирпич человека Linux. Когда программа C звонит malloc для выделения памяти это называет библиотечную функцию в glibc.

Если уже существует достаточно пространства для выделения в процессе, это может сделать любое необходимое управление "кучей" и возвратить память вызывающей стороне.

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

2
22.11.2013, 17:10
3 ответа

Можно использовать rsync с опцией --bwlimit= ограничить пропускную способность и -z сжимать данные файла во время передачи. Используя SSH как транспорт, например.

7
27.01.2020, 21:50
bsdtar cf - . | xz | pv -L 3m | ssh host 'cd /there && xz -d | bsdtar xpSf -'

(здесь использующий bsdtar, поскольку другие обычно не хранят все метаданные файла).

xz вероятно, лучшее сжатие, которое можно получить (но очень интенсивный ЦП), pv для ограничения уровня (отмечают, что это - 3 мега (220) байты в секунду).

Добавьте --numeric-owner опция к второму bsdtar если это для резервного копирования, и Вы хотите сохранить uids/gids.

Это было бы более эффективно (с точки зрения пропускной способности и ресурса на обоих серверах), чем использование rsyncxz сжатие) для полной передачи, но если необходимо возобновить передачу или синхронизирующие папки, у которых есть общие файлы, это то, где rsync прибывает удобный (но читайте rsync страница справочника тщательно для выбора, какие опции необходимо сохранить метаданные, которые Вы хотите сохранить).

3
27.01.2020, 21:50

Для подстраивания сетевой пропускной способности существуют также инструменты, такие как cstream или mbuffer.

В дополнение к -t num отрегулировать пропускную способность к num байты в секунду, cstream, например, не только имеет a -b num опция установить размер блока, используемый для чтения-записи, но также и a -B num опция буферизовать входной блок до num байты перед записью.

Как альтернатива ssh и rsync Вы могли попробовать nc (netcat) или ncat, особенно, если поток данных не собирается пробегаться через Интернет. ncat часть Проекта Nmap и имеет поддержку SSL все же.

# netcat + tar + cstream example to throttle network throughput
# requires netcat on both servers
# cf. http://superuser.com/questions/291803/best-way-to-copy-millions-of-files-between-2-servers/
# cstream -T 10 -t 4m </dev/urandom >/dev/null   # test

nc -l -p 2342 | tar -C /target/dir -xzf -                       # destination box
tar -cz /source/dir | cstream -T 30 -t 4m | nc Target_Box 2342  # source box
0
27.01.2020, 21:50

Теги

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