Bagaimana cara memparalelasikan dd?

10

Saat ini saya mengalami masalah dengan dddipanggil dengan file jarang sebagai input ( if) dan file sebagai output ( of) dengan conv=sparse. ddtampaknya hanya menggunakan satu inti dari CPU ( Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz4 core + 4 Intel Hyperthreads) (100% dari 1 core), jadi saya bertanya-tanya apakah mungkin untuk melakukan paralelisasi dd. saya telah

  • melihat ke dalam info dddan man dddan tampaknya ada fungsi built-in dalam versi corutils 8.23
  • memeriksa sgp_dddari sg3-utilspaket (tanpa memahami apakah itu sesuai dengan kebutuhan saya), tetapi sepertinya tidak dapat menangani file yang jarang
  • dcfldd tampaknya tidak memiliki kemampuan paralelisasi

AFAIK

  • versi / garpu yang ditingkatkan dengan penanganan internal bagian-bagian program dalam banyak utas (menghindari perubahan konteks yang mematikan kinerja I / O) lebih disukai daripada
  • solusi dengan GNU parallelberjalan secara lokal lebih disukai daripada
  • sniplet kode khusus (mungkin belum teruji)

Bagaimana cara menghindari CPU yang menjadi penghambat operasi intensif I / O? Saya ingin menjalankan perintah pada Ubuntu 14.04 dengan Linux 3.13 dan menangani gambar disk file jarang dengan itu pada sistem file yang mendukung file jarang (setidaknya solusinya tidak boleh terikat pada satu sistem file tertentu).

Latar Belakang: Saya mencoba membuat salinan file jarang 11TB (berisi sekitar 2TB data) pada zfs (zfsonlinux 0.6.4 versi tidak stabil, mungkin buggy dan penyebab kemacetan CPU (akhirnya pencarian lubang lambat)). Itu seharusnya tidak mengubah apa pun untuk pertanyaan tentang bagaimana memparalelkan dd (dengan cara yang sangat umum).

Karl Richter
sumber
Saya tidak melihat apa yang bisa Anda peroleh dari ini, karena operasi ini terikat I / O kecuali dalam kasus-kasus ekstrim. Menurut pendapat saya pilihan terbaik adalah program yang jarang disadari, misalnya xfs_copy . Its halaman manual menyebutkan: "Namun, jika file yang dibuat pada filesystem XFS, file mengkonsumsi kira-kira jumlah ruang benar-benar digunakan dalam filesystem sumber dengan filesystem dan XFS log Penghematan ruang karena xfs_copy berusaha blok atas bebas. bukannya menyalinnya dan sistem file XFS mendukung file jarang secara efisien.
Cristian Ciupitu
@ mikeserv Saya tidak mengerti komentar Anda ...
Karl Richter
@CristianCiupitu Nah dalam kasus saya CPU adalah bottleneck - jangan tanya kenapa, karena saya tidak tahu. Jawaban Anda membuat saya sadar bahwa solusinya harus mendukung banyak sistem file (dapat menangani file jarang) (diedit)
Karl Richter
Apa CPU dan sistem file yang Anda miliki? Seberapa besar file (panjang & blok)?
Cristian Ciupitu
4
ddbabi CPU secara default karena ukuran kecil. membuatnya lebih besar, seperti bs=1M.
frostschutz

Jawaban:

4

Diuji dalam Bash:

INFILE=in
seq 0 1000 $((`stat --format %s $INFILE` /100000 )) |
  parallel -k dd if=$INFILE bs=100000 skip={} conv=sparse seek={} count=1000 of=out

Anda mungkin perlu menyesuaikan 1000.

Ole Tange
sumber
2

Satu sniplet kode khusus yang belum teruji muncul:

dd if=oldf conv=sparse bs=1k                 count=3000000000                 of=newf &
dd if=oldf conv=sparse bs=1k skip=3000000000 count=3000000000 seek=3000000000 of=newf &
dd if=oldf conv=sparse bs=1k skip=6000000000 count=3000000000 seek=6000000000 of=newf &
dd if=oldf conv=sparse bs=1k skip=9000000000 count=3000000000 seek=9000000000 of=newf &
wait

Ini secara logis harus mempartisi file menjadi empat potongan 3TB dan memprosesnya secara paralel. ( skip=melompati blok input; seek=mencari blok keluaran.) Perintah keempat tentu saja akan membaca hingga akhir file lama, sehingga count=parameter tidak benar-benar diperlukan.

G-Man Mengatakan 'Reinstate Monica'
sumber
Saya memikirkan beberapa hal seperti itu juga, tetapi tidak tahu bagaimana membuatnya menjadi solusi umum untuk file ukuran sewenang-wenang (latar belakang pertanyaan seharusnya tidak mempengaruhi permintaan saya untuk solusi generik)
Karl Richter
Saya tidak mengerti apa yang Anda katakan. Saya baru saja mengambil ukuran file Anda dan dibagi dengan jumlah core. Itu sepele bisa dilakukan dengan script.
G-Man Mengatakan 'Reinstate Monica'
3
mungkin juga perluconv=notrunc
frostschutz
@ frostschutz: Mungkin hanya yang pertama. Meskipun saya tidak dapat menemukan ini didokumentasikan, pengujian saya menunjukkan bahwa conv=notrunctersirat seek=dengan nilai positif.
G-Man Mengatakan 'Reinstate Monica'
1
tidak, mencari tidak menyiratkan notrunc.
frostschutz