Apa cara terbaik untuk melakukan salinan paralel di Unix?

17

Saya secara rutin harus menyalin isi folder pada sistem file jaringan ke komputer lokal saya. Ada banyak file (1000s) pada folder jarak jauh yang semuanya relatif kecil tetapi karena overhead jaringan, salinan biasa cp remote_folder/* ~/local_folder/membutuhkan waktu yang sangat lama (10 menit).

Saya percaya itu karena file sedang disalin secara berurutan - setiap file menunggu sampai yang sebelumnya selesai sebelum salinan dimulai.

Apa cara paling sederhana untuk meningkatkan kecepatan salinan ini? (Saya menganggap itu adalah untuk melakukan salinan secara paralel.)

Zip file sebelum menyalin tidak selalu mempercepat karena mereka semua dapat disimpan pada disk yang berbeda di server yang berbeda.

dsg
sumber
Zip file sebelum menyalin akan mempercepat secara besar-besaran karena tidak perlu ada lagi "apakah Anda mendapatkan file itu", "ya, saya lakukan", "ini yang berikutnya", "oke", ... Itu yang "perputaran" yang memperlambat Anda.
David Schwartz
Ini mungkin kecepatan disk, bukan kecepatan jaringan, itulah faktor pembatas Anda, dan jika itu yang terjadi maka melakukan ini per file secara paralel akan membuat operasi lebih lambat , bukan lebih cepat, karena Anda akan memaksa disk untuk terus bolak-balik mencari antar file.
Joel Coehoorn
Meskipun zip mungkin bukan ide yang baik (menjalankan kompresi lebih dari 1000 file mungkin memakan waktu agak lama), tar mungkin dapat digunakan.
Rob
@ JoelCoehoorn tetap, ada kasus-kasus ketika ini tidak terjadi: misalnya beberapa spindle + file kecil (atau hanya dibaca acak). Dalam skenario ini, "parallel cp" akan membantu.
CAFxX
serverfault.com/questions/152331/parallel-file-copy
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

8

Selama Anda membatasi perintah salin yang Anda jalankan, Anda mungkin bisa menggunakan skrip seperti yang diposting oleh Scrutinizer

SOURCEDIR="$1"
TARGETDIR="$2"
MAX_PARALLEL=4
nroffiles=$(ls "$SOURCEDIR" | wc -w)
setsize=$(( nroffiles/MAX_PARALLEL + 1 ))
ls -1 "$SOURCEDIR"/* | xargs -n "$setsize" | while read workset; do
  cp -p "$workset" "$TARGETDIR" &
done
wait
Serigala tua
sumber
1
Catatan peringatan: Script ini rusak dengan nama file yang mengandung spasi atau karakter globbing.
slhck
@OldWolf - Bisakah Anda menjelaskan cara kerja skrip ini? Misalnya, bagian mana yang diparalelisasi?
dsg
3
@dsg: Di &akhir cpperintah memungkinkan whileloop untuk melanjutkan dan memulai perintah cp berikutnya tanpa menunggu. The xargsperintah melewati nama file dalam kelompok 4 (MAX_PARALLEL) ke whilelingkaran.
RedGrittyBrick
Tidak bekerja untuk saya. Saya tidak yakin mungkin untuk mempercepat cp. Anda dapat mempercepat perhitungan melalui multithreading. Tapi saya tidak berpikir hal yang sama berlaku untuk penanganan data hard drive.
Adobe
3

Salah satu caranya adalah dengan menggunakan rsync yang hanya akan menyalin perubahan - file baru dan bagian yang diubah dari file lain.

http://linux.die.net/man/1/rsync

Menjalankan segala bentuk operasi penyalinan paralel mungkin akan membanjiri jaringan Anda dan operasi penyalinan hanya akan terhenti atau mengalami kemacetan di disk sumber atau tujuan.

Linker3000
sumber
2

Jujur, alat terbaik adalah gsutil Google. Ini menangani salinan paralel dengan rekursi direktori. Sebagian besar metode lain yang saya lihat tidak dapat menangani rekursi direktori. Mereka tidak secara spesifik menyebutkan sistem file lokal ke salinan sistem file lokal di dokumen mereka, tetapi itu berfungsi seperti pesona.

Ini adalah biner lain untuk diinstal, tetapi mungkin salah satu yang sudah Anda jalankan mengingat semua adopsi layanan cloud saat ini.

diq
sumber
2

Rsync paralel menggunakan find:

export SOURCE_DIR=/a/path/to/nowhere
export DEST_DIR=/another/path/to/nowhere

# sync folder structure first
rsync -a -f'+ */' -f'- *' $SOURCE_DIR $DEST_DIR

# cwd
cd $SOURCE_DIR

# use find to help filter files etc. into list and pipe into gnu parallel to run 4 rsync jobs simultaneously
find . -type f | SHELL=/bin/sh parallel --linebuffer --jobs=4 'rsync -av {} $DEST_DIR/{//}/'

pada LAN perusahaan, rsync tunggal bekerja sekitar 800Mbps; dengan 6-8 pekerjaan saya bisa mendapatkan lebih dari 2.5Gbps (dengan mengorbankan beban tinggi). Dibatasi oleh disk.

yee379
sumber
0

Ada banyak hal yang harus dipertimbangkan tergantung pada topologi yang Anda miliki. Tetapi sebelum Anda mulai memikirkan solusi yang kompleks, Anda bisa mencoba membagi tugas menjadi dua pekerjaan dan memeriksa apakah waktu yang dibutuhkan akan berkurang secara signifikan:

Lain kali coba:

  cp remote_folder/[a-l]* ~/local_folder/ &
  cp remote_folder/[!a-l]* ~/local_folder/ &
  wait
  wait

(Anda mungkin ingin mengganti [al] * ke sesuatu yang cocok dengan sekitar setengah dari file - mungkin [0-4] * - tergantung pada isi folder)

Jika waktu meningkat tidak secara dramatis, mungkin lebih penting untuk memeriksa apakah perlu menyalin semua file (berapa rasio file yang diubah dengan semua file?)

ktf
sumber