Was ist der schnellste Weg, um eine Datei mit geringer Dichte zu kopieren? Welche Methode ergibt die kleinste Datei?

10

HINTERGRUND : Ich kopiere ein spärliches qcow2-VM-Image mit einer Größe von 200 GB, aber 16 GB zugewiesenen Blöcken. Ich habe verschiedene Methoden ausprobiert, um diese Datei mit geringer Dichte auf denselben Server zu kopieren, und habe einige vorläufige Ergebnisse erzielt. Die Umgebung ist RHEL 6.6 oder CentOS 6.6 x64.

ls -lhs srcFile 
16G -rw-r--r-- 1 qemu qemu 201G Feb  4 11:50 srcFile

Via cp - beste Geschwindigkeit

cp --sparse=always srcFile dstFile
Performance Notes:
    Copied 200GB max/16GB actual VM as 200GB max/26GB actual, bloat: 10GB
    Copy time: 1:02 (mm:ss) 

Via dd - bester Gesamtdarsteller

dd if=srcFile of=dstFile iflag=direct oflag=direct bs=4M conv=sparse
Performance Notes:
    Copied 200GB max/16GB actual VM as 200GB max/21GB actual, bloat: 5GB
    Copy time: 2:02 (mm:ss)

Über cpio

mkdir tmp$$
echo srcFile | cpio -p --sparse tmp$$; mv tmp$$/srcFile dstFile
rmdir tmp$$
Performance Notes:
    Copied 200GB max/16GB actual VM as 200GB max/26GB actual, bloat: 10GB
    Copy time: 9:26 (mm:ss)

Über rsync

rsync --ignore-existing -aS srcFile dstFile
Performance Notes:
    Copied 200GB max/16GB actual VM as 200GB max/26GB actual, bloat: 10GB
    Copy time: 24:49 (mm:ss)

Über virt-sparsify - beste Größe

virt-sparsify srcFile dstFile
    Copied 200GB max/16GB actual VM as 200GB max/16GB actual, bloat: 0
    Copy time: 17:37 (mm:ss)

Unterschiedliche Blockgröße

Ich war besorgt über das Aufblähen während des DD-Kopierens (Erhöhung der Dateigröße gegenüber dem Original), daher habe ich die Blockgröße variiert. Ich habe 'Zeit' verwendet, um auch die Gesamtzeit und die CPU% zu erhalten. Die Originaldatei ist in diesem Fall eine 7,3 GB spärliche 200 GB-Datei:

4K:   5:54.64, 56%, 7.3GB
8K:   3:43.25, 58%, 7.3GB
16K:  2:23.20, 59%, 7.3GB
32K:  1:49.25, 62%, 7.3GB
64K:  1:33.62, 64%, 7.3GB
128K: 1:40.83, 55%, 7.4GB
256K: 1:22.73, 64%, 7.5GB
512K: 1:44.84, 74%, 7.6GB
1M:   1:16.59, 70%, 7.9GB
2M:   1:21.58, 66%, 8.4GB
4M:   1:17.52, 69%, 9.5GB
8M:   1:10.92, 76%, 12GB
16M:  1:17.09, 78%, 16GB
32M:  2:54.10, 90%, 22GB

FRAGE : Können Sie überprüfen, ob ich die besten Methoden zum Kopieren einer Datei mit geringer Dichte ermittelt habe, um die beste Gesamtleistung zu erzielen? Vorschläge, wie dies besser gemacht werden kann, sind ebenso willkommen wie etwaige Bedenken hinsichtlich der von mir verwendeten Methoden.

Steve Amerige
quelle
Die einzige andere, die ich angesichts Ihrer lobenswerten Bemühungen versuchen würde, ist rsync mit der Option --sparse. Es ist auch möglich, dass eine andere Blockgröße in dd die Geschwindigkeit verbessert oder aufbläht.
mpez0
Teer ist auch gut zu versuchen
Olivier Dulac
@OlivierDulac Ich habe es mit Teer versucht, aber das war so schlecht, dass ich es nicht einmal aufgenommen habe. Ich sollte. Die oben genannten sind lokale Kopien. Ich füge Netzwerkdaten zum Kopieren von Leistung für ein 10-Gbit / s-Netzwerk hinzu und kopiere in dasselbe Subnetz. Sobald ich das habe, denke ich, werde ich genug Daten haben, um eine brauchbare Schlussfolgerung zu ziehen, für die der beste Gesamtdarsteller ist.
Steve Amerige
rsync unterstützt auch --sparse für diesen Kopierstil. Vielleicht möchten Sie das versuchen. Hat auch den zusätzlichen Vorteil, dass es sowohl beim lokalen Kopieren als auch beim Kopieren über das Netzwerk messbar ist.
Travis Campbell
@TravisCampbell Ich habe Daten für rsync hinzugefügt. Es war der schlechteste aller Tests, die ich durchgeführt habe.
Steve Amerige

Antworten:

5

Aus dem obigen Benchmarking geht hervor, dass die Verwendung von dd auf unserer Zielhardware mit einer Blockgröße von 64 KB unter Berücksichtigung der Kopierzeit und des Aufblähens das beste Gesamtergebnis liefert:

dd if=srcFile of=dstFile iflag=direct oflag=direct bs=64K conv=sparse
Steve Amerige
quelle
2
Hallo Steve, bitte teile eine Antwort in Frage, so funktionieren Stackexchange-Sites.
Bummi