Bagaimana cara mempercepat rsync?

44

Saya menjalankan rsync untuk menyinkronkan direktori ke HDD USB eksternal saya. Ini sekitar 150 pertunjukan data. 50000+ file saya kira.

Ini sedang berjalan, ini sinkronisasi pertama saat ini, tetapi menyalin file dengan kecepatan hanya 1-5 MB / s. Tampaknya sangat lambat untuk penutup USB 2.0. Tidak ada transfer lain yang terjadi di drive juga.

Berikut adalah opsi yang saya gunakan:

rsync -avz --progress /mysourcefolder /mytargetfolder

Saya menjalankan Ubuntu Server 9.10.

Jake Wilson
sumber
2
Anda yakin mendapat koneksi USB2? apakah operasi (non-rsync) menyalin atau operasi tulis lainnya berjalan pada kecepatan normal? jika tidak, sudahkah Anda mencoba copy / op penulisan lainnya dengan port USB lain?
quack quixote
Lihat juga serverfault.com/questions/43014/... - ada orang yang juga mengusulkan menggunakan dua tarperintah pipa atau cpio.
Blaisorblade

Jawaban:

38

Untuk sinkronisasi pertama gunakan saja

cp -a  /mysourcefolder /mytargetfolder

rsync hanya menambahkan overhead ketika tujuan kosong.

juga .. opsi -z mungkin membunuh kinerja Anda, Anda tidak boleh menggunakannya jika Anda tidak mentransfer data melalui tautan lambat.

pengguna23307
sumber
3
rsync disebut demikian karena ini untuk sinkronisasi jarak jauh dan tidak benar-benar sesuai untuk volume yang terhubung secara lokal karena alasan ini.
msanford
6
Seharusnya bisa digunakan juga untuk transfer lokal, dan itu jauh lebih fleksibel. Mungkin saja berlebihan untuk sinkronisasi pertama.
Blaisorblade
1
rsync juga merupakan sinkronisasi satu arah. Sangat bagus untuk mencadangkan ke server atau dari server. Namun, jika Anda ingin sinkronisasi TWO-Way lokal ke drive yang dapat dilepas, Anda mungkin ingin memeriksa csync csync.org/get-it jangan bingung dengan csync2 yang merupakan proyek yang sama sekali berbeda.
Jesse the Wind Wanderer
3
rsync -avz --progress /mysourcefolder/ /mytargetfolderatau Anda akan mendapatkan salinan bagian mysourcefolderdalam mytargetfolderdaripada mencerminkan isinya
editor
3
Jawaban ini tidak menjawab pertanyaan. Pertanyaannya adalah tentang bagaimana mengoptimalkan rsync - tidak menggantinya dengan perintah cp.
oemb1905
38

Jika Anda menggunakan rsync dengan jaringan cepat atau disk ke disk di mesin yang sama,

tidak menggunakan kompresi -z

dan menggunakan --inplace

mempercepatnya hingga kinerja perangkat keras atau jaringan

kompresi menggunakan banyak CPU

tidak menggunakan inplace membuat hard drive thrash banyak (menggunakan file temp sebelum membuat final)

kompresi & tidak menggunakan inplace lebih baik untuk melakukannya melalui internet (jaringan lambat)

BARU: Hati-hati dengan tujuan ... jika ada "kompresi" NTFS diaktifkan ... ini sangat memperlambat file besar (saya akan mengatakan 200MB +) rsync hampir tampak terhenti, itu disebabkan oleh ini.

Scott Kramer
sumber
Kompresi NTFS lambat pada file besar
Scott Kramer
Saya tidak melihat apa pun tentang '--inline' di halaman manual
Anthony
1
Ini '--di tempat'
Scott Kramer
26

Gunakan -Wopsi. Ini menonaktifkan perbandingan delta / diff. Ketika waktu / ukuran file berbeda, rsync menyalin seluruh file.

Hapus juga -zopsi. Ini hanya berguna untuk mengompresi lalu lintas jaringan.

Sekarang rsyncharus secepat cp.

vdboor
sumber
6
Catatan kecil: -zhanya berguna untuk lalu lintas jaringan kecepatan rendah . Jika jaringan Anda cukup cepat, itu akan memperlambat segalanya, karena Anda akan dibatasi oleh CPU.
WhyNotHugo
3
Kiat-kiat ini sangat mempercepat transfer file saya antara dua perangkat NAS, terima kasih!
djhworld
2
tetapi perhatikan bahwa menurut halaman manual mengatakan untuk -W: "Ini adalah default ketika sumber dan tujuan ditetapkan sebagai jalur lokal, tetapi hanya jika tidak ada opsi penulisan batch yang berlaku."
GuoLiang Oon
14

Pertama - jumlah file dalam hal ini akan menjadi faktor utama. Ini ukuran rata-rata masing-masing 3MB. Mungkin ada hambatan io yang mempengaruhi kecepatan dalam kasus OP. Lebih lanjut di sini - itu bacaan yang cukup kering, tetapi gambar sampulnya sepadan.

Jadi, menggunakan rsync untuk menyalin ke direktori kosong? Berikut beberapa cara untuk mempercepatnya:

  1. Tidak -z - pasti tidak menggunakan -z seperti pada OP.
  2. --tidak ada kompres dapat mempercepat Anda. Ini bisa memiliki dampak terbesar ... pengujian saya adalah 13.000 file, ukuran total 200MB, dan menggunakan rsync 3.1.3. Saya disinkronkan ke partisi berbeda pada drive SSD internal yang sama. Dengan --no-kompres, saya mendapatkan 18 MBps, dan tanpa itu saya mendapatkan 15 MBps. Omong-omong, mendapat 16 MBps. Itu ukuran file rata-rata yang jauh lebih kecil. Juga - Saya tidak dapat menemukan dokumentasi untuk --tidak ada kompres. Saya mempelajarinya dari posting ini di stackexchange.com.
  3. -W untuk menyalin file secara keseluruhan - selalu gunakan ini jika Anda tidak ingin membandingkan perbedaan; tidak masalah bahwa titik rsync adalah untuk membandingkan perbedaan dan hanya memperbarui perubahan.
  4. -S untuk menangani file jarang dengan baik - tidak ada salahnya jika Anda tidak memiliki file jarang.
  5. --exclude-from atau sesuatu yang mirip dengan mengecualikan file yang mungkin tidak Anda perlukan akan mengurangi waktu, tetapi itu tidak akan meningkatkan kecepatan transfer Anda.
  6. Itu mungkin jika Anda mengirim output ke file seperti ini rsync -a /source /destination >/somewhere/rsync.out 2>/somewhere/rsync.err- yang pertama> pada dasarnya mencetak file dengan semua hal yang biasanya Anda lihat, dan 2> mengacu pada pesan kesalahan.
  7. Terakhir, menjalankan banyak rsync untuk berbagai bagian transfer Anda bisa sangat membantu.

Perintah saya adalah:

rsync -avAXEWSlHh /source /destination --no-compress --info=progress2 --dry-run

Jika semua terlihat baik, saya akan menghapus "--dry-run" dan biarkan saja. A, X, dan E mencakup atribut yang diperluas dan izin yang tidak tercakup oleh -a, l adalah untuk tautan lunak, H adalah untuk tautan keras, dan h adalah untuk dibaca manusia.

Memperbarui direktori yang sudah disinkronkan pada drive USB, atau drive yang sama, atau melalui jaringan, semua akan memerlukan perintah rsync yang berbeda untuk memaksimalkan kecepatan transfer.

Bonus - inilah halaman manual rsync , dan jika Anda ingin menguji kecepatan hard drive Anda, Bonnie ++ adalah pilihan yang baik, dan untuk kecepatan jaringan Anda, coba iperf .


* Posting sudah hampir sepuluh tahun, tetapi mesin pencari pasti menyukainya, dan saya terus melihatnya. Ini pertanyaan yang bagus, dan saya tidak berpikir jawaban teratas untuk "bagaimana mempercepat rsync" seharusnya "menggunakan cp sebagai gantinya."

Fin Hirschoff
sumber
1
Sehubungan dengan item 7) saya bisa meningkatkan lebih banyak kinerja menggunakan HDD tradisional sebagai sumber, dengan memperluas buffer baca-depan menggunakan "blockdev --setra 8192 / dev / sdX". Jadi saya berniat mengurangi upaya kepala.
user2480144
Saya telah menemukan bahwa S (menangani file Jarang) sebenarnya lambat. Menghapusnya membuatnya lebih cepat
Sammy Guergachi
2

Anda tidak mengatakan ukuran distribusi file Anda. Jika ada banyak file kecil maka ini akan mengurangi kecepatan transfer keseluruhan dengan meningkatkan latensi pergerakan head di drive sumber dan tujuan saat alat membuka file baru dan OS menyimpan entri direktori dan metadata lainnya (seperti jurnal sistem file jika Anda menggunakan penjurnalan meta-data seperti ext3 / ext4 dan NTFS secara default) diperbarui selama transfer. Proses menyalin file hanya akan "masuk ke langkahnya" untuk objek yang lebih besar, ketika transfer massal sederhana terjadi.

David Spillett
sumber
0

Anda pasti ingin mencoba rclone . Hal ini gila cepat:

$ tree / usr [...] 26105 direktori, 293208 file

$ sudo rclone sync / usr / home / fred / temp -P -L --transfers 64

Ditransfer: 17.929G / 17.929 GBytes, 100%, 165.692 MByts / s, ETA 0s Kesalahan: 75 (coba lagi dapat membantu) Cek: 691078/691078, 100% Ditransfer: 345539/345539, 100% Waktu berlalu: 1m50.8s

Ini adalah salinan lokal dari dan ke SSD LITEONIT LCS-256 (256GB).

Anda dapat menambahkan --ignore-checksum pada proses pertama untuk membuatnya lebih cepat.

Frédéric N.
sumber
0

Menghindari

  • -z/ --compress: kompresi hanya akan memuat CPU karena transfer tidak melalui jaringan tetapi lebih dari RAM.
  • --append-verify: melanjutkan transfer yang terputus. Ini kedengarannya seperti ide yang bagus, tetapi memiliki kasus kegagalan berbahaya: file tujuan apa pun dengan ukuran yang sama (atau lebih besar) dari sumber akan di-IGNORED. Selain itu, checksum seluruh file di akhir, yang berarti tidak ada mempercepat secara signifikan --no-whole-filesambil menambahkan kasus kegagalan berbahaya.

Menggunakan

  • -S/ --sparse: mengubah urutan null menjadi blok jarang
  • --partialatau -Pyang --partial --progress: menyimpan file yang ditransfer sebagian untuk melanjutkan kembali di masa depan. Catatan: file tidak akan memiliki nama sementara, jadi pastikan tidak ada lagi yang mengharapkan untuk menggunakan tujuan sampai seluruh salinan selesai.
  • --no-whole-filesehingga segala sesuatu yang perlu dikirim ulang menggunakan transfer delta. Membaca setengah dari file yang ditransfer sebagian seringkali jauh lebih cepat daripada menulisnya lagi.
  • --inplace untuk menghindari penyalinan file (tetapi hanya jika tidak ada yang membaca tujuan sampai seluruh transfer selesai)
Tom Hale
sumber