Salinan File Paralel

9

Saya memiliki daftar file yang perlu saya salin di sistem Linux - masing-masing file berukuran dari 10 hingga 100GB.

Saya hanya ingin menyalin ke sistem file lokal. Apakah ada cara untuk melakukan ini secara paralel - dengan beberapa proses yang masing-masing bertanggung jawab untuk menyalin file - secara sederhana ?

Saya dapat dengan mudah menulis program multithreaded untuk melakukan ini, tetapi saya tertarik untuk mencari tahu apakah ada metode Linux tingkat rendah untuk melakukan ini.

Jon
sumber
1
Salinan file paralel tidak akan mempercepat secara signifikan. (Setidaknya secara teori tidak seharusnya.)
Tarnay Kálmán
superuser.com/questions/327659/… || unix.stackexchange.com/questions/165256/…
Ciro Santilli 冠状 病毒 审查 六四 六四 事件 法轮功
1
@ TarnayKálmán kecuali Anda memiliki sistem file gaya clustered, overlay, RAID, atau "unraid", atau salah satu di atas melalui latensi yang relatif tinggi atau jaringan yang sibuk; atau beban kerja di mana latensi per file adalah bagian penting dari waktu salin untuk file tersebut (1e5 + file yang sangat kecil, backend yang ditujukan untuk konten, dll.). Pemrosesan serentak akan sangat berguna dalam situasi seperti itu.
nilai p

Jawaban:

11

Jika sistem Anda tidak diremukkan olehnya (mis. Mungkin file-file itu ada dalam cache) maka GNU Parallel http://www.gnu.org/software/parallel/ dapat bekerja untuk Anda:

find . -print0 | parallel -0 -j10 cp {} destdir

Ini akan menjalankan 10 bersamaan cp.

Pro: Mudah dibaca.

Con: GNU Parallel tidak standar pada kebanyakan sistem - jadi Anda mungkin harus menginstalnya.

Tonton video intro untuk info lebih lanjut: http://www.youtube.com/watch?v=OpaiGYxkSuQ

Lihat juga https://oletange.wordpress.com/2015/07/04/parallel-disk-io-is-it-faster/ untuk pembahasan disk paralel I / O.

Ole Tange
sumber
3

Tidak ada mekanisme tingkat rendah untuk ini karena alasan yang sangat sederhana: melakukan ini akan merusak kinerja sistem Anda. Dengan platter drive, masing-masing tulisan akan bersaing untuk penempatan kepala, yang mengarah ke menunggu I / O besar-besaran. Dengan SSD, ini akan menjenuhkan satu atau lebih bus sistem Anda, menyebabkan masalah lain.

Ignacio Vazquez-Abrams
sumber
Kesalahan yang tampaknya tidak menjadi masalah dengan satu cp saat ini, saya yakin ada media bahagia untuk beberapa paralel "cp" di mana Anda I / O channel tidak menjadi sepenuhnya jenuh ...
Jon
1
Bus jenuh adalah bus yang menyenangkan. Bandwidth idle adalah bandwidth yang terbuang.
nilai p
3

Seperti yang disebutkan, ini adalah ide yang mengerikan. Tapi saya percaya semua orang harus dapat mengimplementasikan rencana mengerikan mereka sendiri, sooo ...

for FILE in *;do cp $FILE <destination> &;done

Tanda bintang dapat diganti dengan ekspresi reguler file Anda, atau $(cat <listfile>)jika Anda memiliki semuanya dalam dokumen teks. Ampersand memulai perintah di latar belakang, sehingga loop akan berlanjut, menghasilkan lebih banyak salinan.

Seperti yang disebutkan, ini akan sepenuhnya memusnahkan IO Anda. Jadi ... saya benar-benar tidak akan merekomendasikan melakukannya.

--Christopher Karel

Christopher Karel
sumber
3

Satu-satunya jawaban yang tidak akan membuang respons mesin Anda bukanlah 'salinan', tetapi ini sangat cepat. Jika Anda tidak akan mengedit file di lokasi baru atau lama, maka tautan keras secara efektif seperti salinan, dan (hanya) jika Anda berada di sistem file yang sama, mereka dibuat sangat sangat sangat cepat.

Lihat cp -ldan lihat apakah itu akan berhasil untuk Anda.

Slartibartfast
sumber
2

Berikut adalah alat salin file terdistribusi / paralel dan terdesentralisasi yang akan memotong file dan menyalin semua potongan secara paralel. Ini mungkin hanya akan membantu Anda jika Anda memiliki SSD yang mendukung banyak aliran atau semacam pengaturan dengan beberapa kepala disk.

https://github.com/hpc/dcp

Jon Bringhurst
sumber
1

Bagi orang-orang yang berpikir itu bukan ide yang bagus, saya akan mengatakan itu tergantung. Anda dapat memiliki sistem serangan besar atau sistem file paralel yang akan memberikan kinerja yang benar-benar lebih baik daripada yang dapat ditangani oleh satu proses cp. Maka ya, Anda perlu menggunakan "alat paralel".

Mari kita ambil contoh ini:

timeout 10 strace -e write -c cp /dev/zero /dev/null
strace: Process 24187 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00    0.655188           4    166222           write
------ ----------- ----------- --------- --------- ----------------
100.00    0.655188                166222           total

lalu ini

timeout 0.01 strace -e write  cp /dev/zero /dev/null
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
strace: Process 24567 detached

jadi setiap syscall write dibuat oleh "cp" dalam hal ini adalah 64KiB dan untuk 10s pada sistem saya, saya dapat memberikan bandwidth ini: 65536 * 166222/10 = 1089352499 = ~ 1,08GB / s

Sekarang, mari kita luncurkan beban kerja ini dengan 2 proses (Saya memiliki 4 inti tetapi desktop saya digunakan untuk hal-hal lain, dan ini hanya sebuah contoh):

timeout 10 strace -e write -c cp /dev/zero /dev/null & timeout 10 strace -e write -c cp /dev/zero /dev/null &  wait
[1] 26106
[2] 26107
strace: Process 26113 detached
strace: Process 26112 detached
% time     seconds  usecs/call     calls    errors syscall
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
------ ----------- ----------- --------- --------- ----------------
100.00    0.624108           4    162616           write
100.00    0.638468           4    162451           write
------ ----------- ----------- --------- --------- ----------------
100.00    0.624108                162616           total
100.00    0.638468                162451           total
------ ----------- ----------- --------- --------- ----------------
[1]-  Exit 124                timeout 10 strace -e write -c cp /dev/zero /dev/null

Jadi kami melihat kami dapat hampir menggandakan kinerja menggunakan 2 inti untuk meluncurkan ini.

Jadi jika kita berada dalam konteks yang berbeda dari drive 1xHard ke drive 1xHard tetapi array raid (atau beberapa NVMe jadi bukan kasus yang paling umum saya setuju tapi saya bekerja pada ini setiap hari), itu menunjukkan kinerja yang lebih baik untuk menggunakan multiple common di paralel.

Johann Peyrard
sumber
-1

Anda harus mencoba ini:

    $ seq 3 | parallel cp -v / etc / passwd passwd {}

Ini akan menyalin file passwd 3 kali dari / etc / direktori ke $ HOME Anda

Atau jika file Anda ada di direktori home Anda

    $ seq 3 | parallel cp -v passwd {, {}}

Ini akan menyalin file passwd 3 kali ke $ HOME Anda

pengguna3749113
sumber