Saya telah menggunakan rsync
skrip untuk menyinkronkan data di satu host dengan data di host lain. Data memiliki banyak file berukuran kecil yang berkontribusi hampir 1,2TB.
Untuk menyinkronkan file-file itu, saya telah menggunakan rsync
perintah sebagai berikut:
rsync -avzm --stats --human-readable --include-from proj.lst /data/projects REMOTEHOST:/data/
Isi proj.lst adalah sebagai berikut:
+ proj1
+ proj1/*
+ proj1/*/*
+ proj1/*/*/*.tar
+ proj1/*/*/*.pdf
+ proj2
+ proj2/*
+ proj2/*/*
+ proj2/*/*/*.tar
+ proj2/*/*/*.pdf
...
...
...
- *
Sebagai ujian, saya mengambil dua proyek tersebut (data 8.5GB) dan saya menjalankan perintah di atas. Menjadi proses berurutan, alat 14 menit 58 detik untuk menyelesaikan. Jadi, untuk 1.2TB data akan butuh beberapa jam.
Jika saya dapat melakukan banyak rsync
proses secara paralel (menggunakan &
, xargs
atau parallel
), itu akan menghemat waktu saya.
Saya mencoba dengan perintah di bawah ini dengan parallel
(setelah masuk cd
ke direktori sumber) dan butuh 12 menit 37 detik untuk mengeksekusi:
parallel --will-cite -j 5 rsync -avzm --stats --human-readable {} REMOTEHOST:/data/ ::: .
Ini seharusnya memakan waktu 5 kali lebih sedikit, tetapi tidak. Saya pikir, saya salah di suatu tempat.
Bagaimana saya bisa menjalankan banyak rsync
proses untuk mengurangi waktu eksekusi?
sumber
rsync
s adalah prioritas utama kami.rsync
s secara paralel adalah fokus utama sekarang.Jawaban:
Langkah-langkah berikut berhasil bagi saya:
rsync --dry-run
terlebih dahulu untuk mendapatkan daftar file yang akan terpengaruh.cat transfer.log
keparallel
untuk menjalankan 5rsync
s secara paralel, sebagai berikut:Di sini,
--relative
opsi ( tautan ) memastikan bahwa struktur direktori untuk file yang terpengaruh, di sumber dan tujuan, tetap sama (di dalam/data/
direktori), sehingga perintah harus dijalankan di folder sumber (misalnya,/data/projects
).sumber
split
dan memberi makan nama file tersebut secara paralel. Kemudian gunakan rsync--files-from
untuk mendapatkan nama file dari setiap file dan menyinkronkannya. rm backup. * split -l 3000 backup.list backup. ls backup. * | parallel --line-buffer --verbose -j 5 rsync --progress -av --files-from {} / LOCAL / PARENT / PATH / REMOTE_HOST: REMOTE_PATH /receiving file list ... done
created directory /data/
.--info=name
sebagai pengganti-v
, dan Anda hanya akan mendapatkan nama-nama file dan direktori. Anda mungkin ingin menggunakan --protect-args ke rsync 'inner' untuk mentransfer juga jika ada file yang mungkin memiliki spasi atau karakter meta shell di dalamnya.Saya pribadi menggunakan yang sederhana ini:
Yang hanya berguna ketika Anda memiliki lebih dari beberapa direktori yang hampir kosong, jika tidak Anda akan berakhir hampir setiap
rsync
terminasi dan yang terakhir melakukan semua pekerjaan sendirian.sumber
Saya akan sangat mencegah siapa pun dari menggunakan jawaban yang diterima, solusi yang lebih baik adalah dengan menjelajah direktori tingkat atas dan meluncurkan sejumlah operasi rync yang proporsional.
Saya memiliki volume zfs besar dan sumber saya adalah cifs mount. Keduanya terhubung dengan 10G, dan dalam beberapa tolok ukur dapat menjenuhkan tautan. Kinerja dievaluasi menggunakan
zpool iostat 1
.Drive sumber dipasang seperti:
Menggunakan satu
rsync
proses:io meter berbunyi:
Ini dalam benchmark sintetis (disk kristal), kinerja untuk penulisan sekuensial mendekati 900 MB / s yang berarti tautannya jenuh. 130MB / s tidak terlalu baik, dan perbedaan antara menunggu akhir pekan dan dua minggu.
Jadi, saya membuat daftar file dan mencoba menjalankan sinkronisasi lagi (saya memiliki mesin 64 core):
dan itu memiliki kinerja yang sama!
Sebagai alternatif, saya hanya menjalankan rsync pada folder root:
Ini sebenarnya meningkatkan kinerja:
Sebagai kesimpulan, ketika @Sandip Bhattacharya dibesarkan, tulislah sebuah skrip kecil untuk mendapatkan direktori dan paralel dengannya. Atau, kirimkan daftar file ke rsync. Tapi jangan membuat instance baru untuk setiap file.
sumber
Cara yang diuji untuk melakukan rsync yang diparalelkan adalah: http://www.gnu.org/software/parallel/man.html#EXAMPLE:-Parallelizing-rsync
sumber
find
?--dry-run
opsirsync
, saya akan memiliki daftar file yang akan ditransfer. Bisakah saya memberikan daftar file ituparallel
untuk memparalelkan proses?mkdir -p /dest-dir/{//}\;
bagiannya? Terutama{//}
masalahnya agak membingungkan.Untuk sinkronisasi multi tujuan, saya menggunakan
Petunjuk: Semua koneksi ssh dibuat dengan kunci publik di
~/.ssh/authorized_keys
sumber
Saya selalu google untuk rsync paralel karena saya selalu lupa perintah penuh, tetapi tidak ada solusi yang bekerja untuk saya seperti yang saya inginkan - baik itu termasuk beberapa langkah atau perlu menginstal
parallel
. Saya akhirnya menggunakan one-liner ini untuk menyinkronkan beberapa folder:-P 5
adalah jumlah proses yang ingin Anda spawn - gunakan 0 untuk tidak terbatas (jelas tidak disarankan).--bwlimit
untuk menghindari menggunakan semua bandwidth.-I %
argumen yang disediakan oleh find (direktori ditemukan didir/
)$(echo dir/%/ host:/dir/%/)
- mencetak direktori sumber dan tujuan yang dibaca oleh rsync sebagai argumen. % digantixargs
dengan nama direktori yang ditemukan olehfind
.Mari kita asumsikan saya memiliki dua direktori di
/home
:dir1
dandir2
. Saya larifind /home -type d|xargs -P 5 -I % sh -c 'rsync -a --delete --bwlimit=50000 $(echo /home/%/ host:/home/%/)'
. Jadi perintah rsync akan berjalan sebagai dua proses (dua proses karena/home
memiliki dua direktori) dengan argumen berikut:sumber