Tôi có tệp nhị phân có khoảng 77 MB:
nupic@nupic-virtualbox:~/VboxSharedFolder/experiments/sync/exp2$ ls -lah src/
total 77M
drwxrwx--- 1 root vboxsf 0 Jun 21 13:31 .
drwxrwx--- 1 root vboxsf 4.0K Jun 21 16:21 ..
-rwxrwx--- 1 root vboxsf 77M May 27 2014 binary.bin
Tôi đã chơi với rsync
và đó là tính năng thuật toán delta để xem nó hoạt động như thế nào. Ý tưởng là tạo ra sự khác biệt nhỏ trong tệp nhị phân và xem có bao nhiêu dữ liệu được truyền bằng một số phương pháp. Đối với những mục đích đó, tôi đã tạo ra kịch bản rất đơn giản:
#!/bin/bash
# rsync does not trnansfers delta over local by default
sed 's%\x00\x00\x00\x20\x66\x74\x79\x70\x69\x73\x6f\x6d\x00\x00\x02\x00%\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11%' src/binary.bin > dst/binary.bin
strace -f -e trace=read,write -o rw_rsync_local_default.log rsync -avcz --progress src/ dst/
# rsync -no-W should enables delta tranfer no matter if local or remote
sed 's%\x00\x00\x00\x20\x66\x74\x79\x70\x69\x73\x6f\x6d\x00\x00\x02\x00%\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11%' src/binary.bin > dst/binary.bin
strace -f -e trace=read,write -o rw_rsync_local_delta_enabled.log rsync --no-W -avcz --progress src/ dst/
# rsync trnansfers delta over network by default
sed 's%\x00\x00\x00\x20\x66\x74\x79\x70\x69\x73\x6f\x6d\x00\x00\x02\x00%\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11%' src/binary.bin > dst/binary.bin
strace -f -e trace=read,write -o rw_rsync_remote.log rsync -avcz -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress src/ nupic@localhost:/home/nupic/VboxSharedFolder/experiments/sync/exp2/dst/
# scp should transfers whole file not delta
sed 's%\x00\x00\x00\x20\x66\x74\x79\x70\x69\x73\x6f\x6d\x00\x00\x02\x00%\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11%' src/binary.bin > dst/binary.bin
strace -f -e trace=read,write -o rw_scp.log scp src/binary.bin nupic@localhost:/home/nupic/VboxSharedFolder/experiments/sync/exp2/dst/
# cp always transfers whole file not delta
sed 's%\x00\x00\x00\x20\x66\x74\x79\x70\x69\x73\x6f\x6d\x00\x00\x02\x00%\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11%' src/binary.bin > dst/binary.bin
strace -f -e trace=read,write -o rw_cp.log cp src/binary.bin dst/binary.bin
Sau đó, tôi có vòng lặp sau để đánh giá kết quả:
for i in *.log; do
echo $i; cat $i | grep write | awk 'BEGIN {FS="="}{ sum += $2} END {print sum/1024/1024 "MB"}';
echo "###########";
done
Đây là kết quả:
rw_cp.log
67.8075MB
###########
rw_rsync_local_default.log
146.697MB
###########
rw_rsync_local_delta_enabled.log
66.8765MB
###########
rw_rsync_remote.log
0.0707941MB
###########
rw_scp.log
136.048MB
###########
Từ năm thí nghiệm đó, chỉ có hai là rõ ràng với tôi:
cp
ghi số lượng byte tương đương với kích thước của tệp gốc (rw_cp.log
).rsync
sử dụng thuật toán delta khi đích ở xa (qua mạng) (rw_rsync_remote.log
)
Và đây là những điều không rõ ràng với tôi:
- Tại sao gọi
rsync
trên cả haisrc
vàdst
trênlocalhost
ghi khoảng hai lần byte bằng kích thước của tệp gốc? (rw_rsync_local_default.log
) - Tại sao
--no-W
tùy chọnrsync
không chỉ chuyển delta chosrc
vàdst
trênlocalhost
như đã nêu ở đây và tại sao nó vẫn chuyển toàn bộ tệp? (rw_rsync_local_delta_enabled.log
) - Phần thưởng: Tại sao
scp
chuyển khoảng hai lần byte như kích thước tệp gốc? Tôi hiểu rằng có một số mã hóa nhưng hai lần có vẻ lớn đối với tôi (rw_scp.log
).
scp
tạo ra mộtssh
quy trình con để thực hiện giao thức SSH thực tế (bắt tay, mã hóa và MAC). Do đó, phụ huynh đọc tệp và ghi qua đường ống cho con, đồng thời ghi đồng hồ 'tiến độ' vào thiết bị đầu cuối, khá nhỏ; đứa trẻ đọc đường ống và đọc và ghi ổ cắm cho giao thức SSH, thường thêm 1-2k khởi động và, có thể là 1% vào dữ liệu.