Come parallelizzare dd?


10

Attualmente sto riscontrando problemi con ddinvocato con un file sparse come input ( if) e un file come output ( of) con conv=sparse. ddsembra che stia utilizzando un solo core della CPU ( Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz4 core + 4 Intel Hyperthreads) (100% di 1 core), quindi mi chiedevo se fosse possibile parallelizzare dd. Sono Stato

  • guardando dentro info dde man dde sembra che funzioni integrate nella versione di corutils 8.23
  • controllo sgp_dddal sg3-utilspacchetto (senza capire se soddisfa le mie esigenze), ma non sembra essere in grado di gestire file sparsi
  • dcfldd non sembra avere capacità di parallelizzazione

per quanto ne so

  • è preferibile una versione avanzata / fork con gestione interna delle parti del programma in più thread (evitare cambiamenti di contesto che uccidono le prestazioni di I / O)
  • parallelè preferibile una soluzione con GNU in esecuzione localmente
  • uno sniplet di codice personalizzato (possibilmente non testato)

Come evitare che la CPU sia il collo di bottiglia di un'operazione I / O intensiva? Vorrei eseguire il comando su Ubuntu 14.04 con Linux 3.13 e gestire immagini di dischi di file sparsi con esso su qualsiasi file system che supporti file di tipo sparse (almeno la soluzione non dovrebbe essere associata a un file system specifico).

Contesto: sto cercando di creare una copia di un file sparse di 11 TB (contenente circa 2 TB di dati) su un zfs (zfsonlinux 0.6.4 versione instabile, probabilmente buggy e causa del collo di bottiglia della CPU (eventualmente ricerca lenta del foro)). Ciò non dovrebbe cambiare nulla per la domanda su come parallelizzare dd (in modo molto generico).


Non vedo cosa potresti ottenere da questo, poiché questa operazione è legata all'I / O tranne in casi estremi. A mio avviso, l'opzione migliore sarebbe un programma poco consapevole, ad esempio qualcosa come xfs_copy . La sua pagina man menziona: "Tuttavia, se il file viene creato su un filesystem XFS, il file consuma all'incirca la quantità di spazio effettivamente utilizzato nel filesystem di origine dal filesystem e dal registro XFS. Il risparmio di spazio è dovuto al fatto che xfs_copy cerca su blocchi liberi invece di copiarli e il filesystem XFS supporta file sparsi in modo efficiente. ".
Cristian Ciupitu,

@mikeserv Non capisco il tuo commento ...
Karl Richter,

@CristianCiupitu Beh, nel mio caso la CPU è il collo di bottiglia - non chiedermi perché, perché non lo so. La tua risposta mi ha fatto capire che la soluzione dovrebbe supportare più filesystem (in grado di gestire file sparsi) (modificato)
Karl Richter,

Quale CPU e filesystem hai? Quanto è grande il file (lunghezza e blocchi)?
Cristian Ciupitu,

4
ddimposta la CPU per impostazione predefinita a causa delle dimensioni ridotte. ingrandirlo, come bs=1M.
frostschutz,

Risposte:


4

Testato in 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

Probabilmente dovrai regolare 1000.


2

Un sniplet di codice personalizzato e non testato in arrivo:

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

Ciò dovrebbe partizionare logicamente il file in quattro blocchi da 3 TB ed elaborarli in parallelo. ( skip=salta i blocchi di input; seek=cerca i blocchi di output.) Il quarto comando, ovviamente, leggerà fino alla fine del vecchio file, quindi il count=parametro non è strettamente necessario.


Ho pensato anche a qualcosa del genere, ma non sono riuscito a capire come renderlo una soluzione generica per file di dimensioni arbitrarie (lo sfondo della domanda non avrebbe dovuto influenzare la mia richiesta di una soluzione generica)
Karl Richter,

Non capisco cosa stai dicendo. Ho appena preso la dimensione dichiarata del tuo file e divisa per il numero di core. Ciò può essere banalmente fatto con una sceneggiatura.
G-Man dice "Reinstate Monica" il

3
probabilmente ha anche bisogno diconv=notrunc
frostschutz,

@frostschutz: forse solo il primo. Anche se non riesco a trovare questo documentato, i miei test indicano che conv=notruncè implicito seek=con un valore positivo.
G-Man dice "Ripristina Monica" il

1
no, cercare non implica notrunc.
frostschutz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.