Jaki jest najszybszy sposób na skopiowanie rzadkiego pliku? Jaka metoda daje najmniejszy plik?

11

TŁO : Kopiuję rzadki obraz maszyny wirtualnej qcow2, który ma rozmiar 200 GB, ale ma 16 GB przydzielonych bloków. Próbowałem różnych metod, aby skopiować ten rzadki plik na tym samym serwerze i uzyskać wstępne wyniki. Środowisko to RHEL 6.6 lub CentOS 6.6 x64.

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

Via cp - najlepsza prędkość

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 - najlepszy wynik ogólny

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)

Via 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)

Via 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)

Via virt-sparsify - najlepszy rozmiar

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

Różny rozmiar bloku

Byłem zaniepokojony „wzdęciem” podczas kopiowania dd (zwiększenie rozmiaru pliku w stosunku do oryginału), więc zmieniłem rozmiar bloku. Użyłem „czasu”, aby uzyskać całkowity czas i% procesora. Oryginalny plik w tym przypadku to rzadki plik o pojemności 200 GB o pojemności 7,3 GB:

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

PYTANIE : Czy możesz zweryfikować, że zidentyfikowałem najlepsze metody kopiowania rzadkiego pliku, aby uzyskać najlepszą ogólną wydajność? Wszelkie sugestie, jak to zrobić lepiej, są mile widziane, podobnie jak wszelkie obawy dotyczące metod, których używam.

Steve Amerige
źródło
Jedynym innym, którego spróbuję, biorąc pod uwagę twoje godne pochwały wysiłki, jest rsync z opcją --sparse. Możliwe jest również, że inny rozmiar bloku w dd poprawiłby jego szybkość lub wzdęcie.
mpez0
warto też spróbować smoły
Olivier Dulac
@OlivierDulac Próbowałem smoły, ale był to tak słaby wykonawca, że ​​nawet go nie uwzględniłem. Powinienem mieć. Powyższe są kopiami lokalnymi. Dodam dane o wydajności kopiowania sieciowego dla sieci 10 Gb / s, kopiując w tej samej podsieci. Kiedy to zrobię, myślę, że będę miał wystarczającą ilość danych, aby wyciągnąć wykonalny wniosek, dla którego jest to najlepszy wynik ogólny.
Steve Amerige,
rsync obsługuje także - rzadkie do wykonywania tego stylu kopiowania. Możesz spróbować tego. Dodatkową zaletą jest to, że można je mierzyć zarówno w przypadku kopiowania lokalnego, jak i przez sieć.
Travis Campbell,
@TravisCampbell Dodałem dane do rsync. To był najgorszy ze wszystkich testów, które przeprowadziłem.
Steve Amerige

Odpowiedzi:

5

Z powyższego testu porównawczego wynika, że ​​użycie dd na naszym docelowym sprzęcie o wielkości bloku 64K daje nam najlepszy ogólny wynik, biorąc pod uwagę czas kopiowania i wzdęcia:

dd if=srcFile of=dstFile iflag=direct oflag=direct bs=64K conv=sparse
Steve Amerige
źródło
2
Cześć Steve, podziel się na pytanie odpowiedzią, jak działają strony Stackexchange.
bummi