Как пользоваться rsync
Стандартное поведение
Дважды скачаем с помощью rsync один файл, во второй раз он будет писаться поверх имеющегося:
REMOTE_ISO="oleg@10.90.140.63:/devel/output/Carbon_Billing_oleg.iso"
for i in 1 2; do
time rsync --progress "$REMOTE_ISO" Carbon_Billing_oleg.iso
done
Carbon_Billing_oleg.iso
2940602368 100% 31.61MB/s 0:01:28 (xfer#1, to-check=0/1)
sent 30 bytes received 2940961422 bytes 32859904.49 bytes/sec
total size is 2940602368 speedup is 1.00
real 1m29.065s
user 0m32.420s
sys 0m12.330s
Carbon_Billing_oleg.iso
2940602368 100% 62.84MB/s 0:00:44 (xfer#1, to-check=0/1)
sent 433878 bytes received 217014 bytes 6412.73 bytes/sec
total size is 2940602368 speedup is 4517.80
real 1m41.437s
user 0m11.340s
sys 0m3.880s
Во второй раз вышло даже медленее.
Со сжатием
Добавим к копированию поверх сжатие на максимальном уровне.
time rsync -z --compress-level 9 --progress "$REMOTE_ISO" Carbon_Billing_oleg.iso
Carbon_Billing_oleg.iso
2940602368 100% 57.37MB/s 0:00:48 (xfer#1, to-check=0/1)
sent 433878 bytes received 90 bytes 3892.09 bytes/sec
total size is 2940602368 speedup is 6776.08
real 1m51.406s
user 0m11.530s
sys 0m3.830s
Вышло ещё меделеннее. Это потому что машины находятся в локальной сети. В случае с узким каналом, сжатие ускорит процесс, но с некоторой вероятностью всё сломает. В rsync имеется баг с опцией -z, он может падать при передаче некоторых пакетов. Вероятность очень низкая, но есть, а повторное выкачивание не поможет. Это можно обойти кодом:
rsync() {
/usr/bin/rsync -z $@ || /usr/bin/rsync $@
}
Работа с блоками
Добавим две опции:
--block-size=40507
- размер блока для сравнения-c
- проверка checksum блоков вместо времени изменения файла.
time rsync --block-size=40507 -c -z --compress-level 9 --progress "$REMOTE_ISO" Carbon_Billing_oleg.iso
sent 11 bytes received 67 bytes 2.84 bytes/sec
total size is 2940602368 speedup is 37700030.36
real 0m26.553s
user 0m5.340s
sys 0m0.590s
Без сжатия
В локальной сети сжатие - лишняя вычислительная нагрузка, так что отключим его:
time rsync --block-size=40507 -c --progress "$REMOTE_ISO" Carbon_Billing_oleg.iso
sent 11 bytes received 67 bytes 3.32 bytes/sec
total size is 2940602368 speedup is 37700030.36
real 0m22.893s
user 0m5.170s
sys 0m0.820s
Согласитесь, это куда лучше чем тянуть 2.9гб целиком через scp? :)
Carbon Sync
А теперь - тест разработки Carbon Soft для этих целей: crb_sync.
for i in 1 2; do
time sudo crb_sync /devel/iso_make/output/Carbon_Billing_oleg.iso oleg@10.90.1.140:/storage/iso/ &>/dev/null
done
real 1m32.571s
user 0m38.466s
sys 0m46.955s
real 0m2.039s
user 0m1.127s
sys 0m0.406s
Минусы - все блоки хранятся в папке рядом с файлом, поэтому размер занимаемый копируемыми файлами умножается на 2 и прогрессивно растёт по мере изменений - вся история хранится в той папке.
Плюсы - скорость работы. Когда большой файл меняется внутри незначительно, а денег на диски хватает - минусы меркнут.