Mengapa rsync tidak menggunakan delta-transfer untuk file lokal?

25

Saya memiliki gambar iso besar yang saat ini sedang diunduh oleh klien torrent dengan reservasi ruang dihidupkan: itu berarti, ukuran file tidak berubah sementara beberapa potongan dalam (4 Mib) terus berubah karena pengunduhan.

Pada 90% unduhan saya melakukan rsync awal untuk menghemat waktu nanti:

$ rsync -Ph DVD.iso / media / another-hdd /
mengirim daftar file tambahan

DVD.iso
       2.60G 100% 40.23MB / s 0:01:01 (xfer # 1, to-check = 0/1)

mengirim 2,60G byte yang diterima 73 byte 34,59M byte / detik
ukuran total speedup 2.60G adalah 1.00

Lalu, ketika file sudah sepenuhnya diunduh, saya rsync lagi:

total size is 2.60G   speedup is 1.00

Speedup = 1 mengatakan delta-transfer tidak digunakan, meskipun 90% dari file tidak berubah, target dir pada FS lain dan menyalin membutuhkan beberapa menit. Mengapa tidak mencoba mempercepat transfer ?! Bagaimana saya bisa memaksa rsyncuntuk menggunakan delta-transfer?

kolypto
sumber
6
Apa yang Anda lakukan tidak masuk akal. Tujuan rsync adalah mempercepat transfer file melalui jaringan, bukan secara lokal. Untuk menemukan perbedaannya, ia harus membaca sumber dan tujuan. Dalam waktu yang diperlukan untuk membaca tujuan secara lokal untuk menemukan perbedaannya, Anda sebaiknya melakukan salinan normal. Cukup unduh file ke tujuan daripada menyalinnya.
psusi
1
Jadi itu tidak menggunakan delta-xfer karena, bekerja secara lokal, lebih cepat untuk menyalin daripada menghitung hash? Jika ya - posting jawabannya plz :)
kolypto
9
Membaca bisa lebih cepat daripada menulis ke disk lokal dalam keadaan tertentu. Itu juga dapat mengurangi keausan pada SSD. Ini tentu pertanyaan yang valid dan jawabannya cukup berharga bagi saya.
HRJ
2
@psusi terlepas dari komentar HRJ di atas, pertimbangkan juga kasus ketika file target telah direfleksikan (misalnya pada btrfs atau ocfs2). Meminimalkan penulisan selama sinkronisasi dapat membuat perbedaan besar pada keseluruhan penggunaan ruang.

Jawaban:

20

Menurut halaman manual , psusi benar:

-W, --whole-file : Transfer mungkin lebih cepat jika opsi ini digunakan ketika bandwidth antara mesin sumber dan tujuan lebih tinggi daripada bandwidth ke disk (terutama ketika "disk" sebenarnya adalah sistem file jaringan). Ini adalah default ketika sumber dan tujuan ditetapkan sebagai jalur lokal, tetapi hanya jika tidak ada opsi penulisan batch yang berlaku.

liganic
sumber
10
Oh terima kasih! Saya salah membaca baris ini :) Untuk mengaktifkan delta-trasfer, gunakan-no-W
kolypto
1
Pada sistem saya -no-Wtidak hanya bekerja opsi panjang -no-whole-file. Alasan saya membutuhkan sakelar ini adalah ketika saya menyiapkan cadangan dan memiliki file besar (mis. Gambar) yang tidak memiliki waktu modifikasi yang sama. Jauh lebih cepat, speedup 163.26, untuk menyinkronkan file-file ini menggunakan delta-transfer pada sistem file lokal saya.
Jesse the Wind Wanderer
6
@JessetheWindWanderer, opsi yang panjang adalah --no-whole-file(tolong, perhatikan ganda --di awal).
Eddie C.
Terima kasih Eddie C. Saya akan mengedit komentar saya jika saya bisa mengetahui caranya :-(
Jesse the Wind Wanderer
17

Jawaban langsung untuk pertanyaan ini adalah:

Gunakan --no-Wbendera untuk memaksa kompresi delta, tidak masalah lokal atau jarak jauh.

Pembaruan: Sepertinya ada lebih banyak cerita. The delta compressiontampaknya diaktifkan hanya antara menerima dan proses pancar rsync. Saat mengeluarkan file ke sistem file, rsyncmungkin masih menulis seluruh file, bahkan dengan kompresi delta aktif.

Lihat penyelidikan "Wakan Tanka" di sini .

HRJ
sumber
2
--no-Wselalu transfer seluruh file dalam kasus saya. Silakan periksa unix.stackexchange.com/questions/291156/…
Wakan Tanka
@WakanTanka Itu menarik! Saya telah memperbarui jawaban saya.
HRJ
3

Secara default, rsync pertama kali membuat salinan baru dari file target dan kemudian menggantinya, karena berbagai alasan keamanan. Anda dapat mengesampingkan ini dengan menentukan --inplacebersama dengan --no-whole-file. Ini memberitahu rsync untuk melakukan pengeditan di tempat file target, menerima berbagai risiko (biasanya kecil untuk situasi ini) seperti yang didokumentasikan dalam halaman manual.

kartik_subbarao
sumber
0

Secara default, rsyncbuat salinan file di tempat tujuan dan kemudian diganti secara orisinal dengan yang baru. Ini dilakukan untuk alasan keamanan. Apa yang Anda cari adalah --inplaceopsi, yang akan menyebabkan rsynchanya memodifikasi bagian dari file tujuan yang telah berubah relatif terhadap sumbernya.

Untuk kasus penggunaan OP, saya sarankan mematikan pra-alokasi juga, sehingga salinan jarang dapat disinkronkan, yang akan jauh lebih cepat. Untuk unduhan, jangan khawatir tentang fragmentasi kecuali Anda menggunakan sistem file yang sangat kuno seperti VFAT. File media pada khususnya tidak dibaca pada kinerja maksimum media penyimpanan, jadi mendefragmennya adalah upaya yang sia-sia.

Untuk menyalin direktori unduhan Anda ke volume tujuan, saya sarankan flag dan operasi ini, dalam urutan ini:

rsync --ignore-existing -vxaHAXS /source /destination
rsync --inplace -vxaHAX /source /destination

Lulus pertama akan menyalin file baru jarang ke tujuan Lewat kedua akan memperbarui file yang ada di tempat, hanya menyalin perubahan

Karena itu melakukan salinan delta yang jarang dan di tempat, Anda dapat menjalankan ini berulang kali tanpa menimbulkan IO ekstra. Bahkan jika Anda memiliki 20 torrents yang berjalan secara bersamaan, itu tidak akan memperkuat penulisan di tujuan, atau menghancurkan volume source / dest.

Wil
sumber
Apa maksudmu dengan "jarang" di sini, Wil? Itu tidak benar-benar mencerminkan arti sebenarnya dari kata itu, sejauh yang saya tahu.
Julius
@ Julius: artinya persis seperti yang disiratkannya - salin file dengan dukungan penuh untuk alokasi yang jarang, jadi misalnya film HDR 40GB Anda tidak akan memakan lebih banyak ruang di tujuan daripada di sumbernya. Sama dengan gambar disk VirtualBox. Seperti yang dinyatakan OP akan perlu menonaktifkan pra-alokasi agar bisa berfungsi.
Wil