Wie kann man dd parallelisieren?

9

Ich habe derzeit Probleme beim ddAufrufen mit einer Datei mit geringer Dichte als Eingabe ( if) und einer Datei als Ausgabe ( of) mit conv=sparse. ddAnscheinend wird nur ein Kern der CPU ( Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz4 Kerne + 4 Intel Hyperthreads) verwendet (100% von 1 Kern), daher habe ich mich gefragt, ob eine Parallelisierung möglich ist dd. Ich war

  • Ein Blick in info ddund man ddund es scheint eine eingebaute Funktion in der Version von Corutils 8.23 ​​zu geben
  • Überprüfung sgp_ddaus dem sg3-utilsPaket (ohne zu verstehen, ob es meinen Anforderungen entspricht), aber es scheint nicht in der Lage zu sein, spärliche Dateien zu verarbeiten
  • dcfldd scheint keine Parallelisierungsfähigkeiten zu haben

so viel ich weiss

  • Eine erweiterte Version / Verzweigung mit interner Behandlung von Programmteilen in mehreren Threads (vermeiden Sie Kontextänderungen, die die E / A-Leistung beeinträchtigen) wird bevorzugt
  • Eine Lösung mit parallellokal ausgeführtem GNU wird gegenüber einer Lösung bevorzugt
  • ein benutzerdefiniertes (möglicherweise nicht getestetes) Code-Sniplet

Wie kann vermieden werden, dass die CPU der Engpass eines E / A-intensiven Vorgangs ist? Ich möchte den Befehl unter Ubuntu 14.04 unter Linux 3.13 ausführen und damit spärliche Datei-Disk-Images auf jedem Dateisystem verarbeiten, das spärliche Dateien unterstützt (zumindest sollte die Lösung nicht an ein bestimmtes Dateisystem gebunden sein).

Hintergrund: Ich versuche, eine Kopie einer 11-TB-Sparse-Datei (mit ca. 2 TB Daten) auf einem zfs zu erstellen (zfsonlinux 0.6.4 instabile Version, möglicherweise fehlerhaft und die Ursache für den CPU-Engpass (eventuell langsame Lochsuche)). Das sollte nichts an der Frage ändern, wie man dd parallelisiert (auf sehr generische Weise).

Karl Richter
quelle
Ich sehe nicht, was Sie davon profitieren könnten, da diese Operation außer in extremen Fällen an E / A gebunden ist. Meiner Meinung nach wäre die beste Option ein Programm, das sich nur wenig bewusst ist, z . B. so etwas wie xfs_copy . In der Manpage wird Folgendes erwähnt: "Wenn die Datei jedoch in einem XFS-Dateisystem erstellt wird, belegt die Datei ungefähr den Speicherplatz, der vom Dateisystem und vom XFS-Protokoll tatsächlich im Quelldateisystem verwendet wird. Die Speicherplatzersparnis liegt darin, dass xfs_copy über freie Blöcke sucht anstatt sie zu kopieren und das XFS-Dateisystem unterstützt spärliche Dateien effizient. "
Cristian Ciupitu
@mikeserv Ich verstehe Ihren Kommentar nicht ...
Karl Richter
@CristianCiupitu Nun, in meinem Fall ist die CPU der Engpass - frag mich nicht warum, weil ich es nicht weiß. Ihre Antwort machte mir klar, dass die Lösung mehrere Dateisysteme unterstützen sollte (die mit spärlichen Dateien umgehen können) (bearbeitet)
Karl Richter
Welche CPU und welches Dateisystem haben Sie? Wie groß ist die Datei (Länge & Blöcke)?
Cristian Ciupitu
4
ddDie CPU wird aufgrund der geringen Blockgröße standardmäßig belastet. mach es größer, wie bs=1M.
Frostschutz

Antworten:

3

In Bash getestet:

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

Sie müssen wahrscheinlich 1000 einstellen.

Ole Tange
quelle
2

Ein benutzerdefiniertes, nicht getestetes Code-Sniplet wird angezeigt:

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

Dadurch sollte die Datei logisch in vier 3-TB-Blöcke aufgeteilt und parallel verarbeitet werden. ( skip=überspringt Eingabeblöcke; seek=sucht über Ausgabeblöcke.) Der vierte Befehl liest natürlich bis zum Ende der alten Datei, sodass der count=Parameter nicht unbedingt erforderlich ist.

G-Man sagt "Reinstate Monica"
quelle
Ich habe auch über solche nachgedacht, konnte aber nicht herausfinden, wie ich daraus eine generische Lösung für Dateien beliebiger Größe machen kann (der Hintergrund der Frage hätte meine Anfrage nach einer generischen Lösung nicht beeinflussen sollen)
Karl Richter
Ich verstehe nicht, was du sagst. Ich habe gerade die angegebene Größe Ihrer Datei genommen und durch die Anzahl der Kerne geteilt. Das kann trivial mit einem Skript gemacht werden.
G-Man sagt "Reinstate Monica"
3
wahrscheinlich braucht auchconv=notrunc
Frostschutz
@frostschutz: Vielleicht nur der erste. Obwohl ich dies nicht dokumentiert finden kann, zeigen meine Tests, dass dies mit einem positiven Wert conv=notruncimpliziert ist seek=.
G-Man sagt "Reinstate Monica"
1
nein, suchen bedeutet nicht notrunc.
Frostschutz