Quel est le moyen le plus rapide de copier un fichier clairsemé? Quelle méthode donne le plus petit fichier?

11

CONTEXTE : je copie une image VM qcow2 clairsemée de 200 Go, mais avec 16 Go de blocs alloués. J'ai essayé différentes méthodes pour copier ce fichier clairsemé sur le même serveur et obtenir des résultats préliminaires. L'environnement est RHEL 6.6 ou CentOS 6.6 x64.

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

Via cp - meilleure vitesse

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 - meilleure performance globale

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 - meilleure taille

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

Varier la taille des blocs

J'étais préoccupé par le 'ballonnement' lors de la copie dd (augmentation de la taille du fichier par rapport à l'original), j'ai donc varié la taille du bloc. J'ai utilisé le «temps» pour obtenir également le temps total et le% CPU. Dans ce cas, le fichier d'origine est un fichier clairsemé de 7,3 Go: 200 Go:

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

QUESTION : Pouvez-vous vérifier que j'ai identifié les meilleures méthodes de copie d'un fichier fragmenté pour obtenir les meilleures performances globales? Toutes les suggestions sur la façon de mieux le faire sont les bienvenues, tout comme les préoccupations que vous pourriez avoir avec les méthodes que j'utilise.

Steve Amerige
la source
Le seul autre que j'essaierais, étant donné vos efforts louables, est rsync avec l'option --sparse. Il est également possible que différentes tailles de blocs en dd améliorent sa vitesse ou son gonflement.
mpez0
le goudron est bon à essayer aussi
Olivier Dulac
@OlivierDulac J'ai essayé tar, mais c'était un artiste si pauvre que je ne l'ai même pas inclus. J'aurais dû. Ce qui précède sont des copies locales. Je vais ajouter des données de performances de copie réseau pour un réseau 10 Gbit / s, en copiant dans le même sous-réseau. Une fois que j'ai cela, je pense que j'aurai suffisamment de données pour tirer une conclusion pratique pour lequel est le meilleur interprète global.
Steve Amerige
rsync prend également en charge --sparse pour effectuer ce style de copie. Vous voudrez peut-être essayer cela. A également l'avantage d'être mesurable sur la copie locale et sur le réseau.
Travis Campbell
@TravisCampbell J'ai ajouté des données pour rsync. C'était la pire performance de tous les tests que j'ai effectués.
Steve Amerige

Réponses:

5

D'après l'analyse comparative ci-dessus, il semble que l'utilisation de dd sur notre matériel cible avec une taille de bloc de 64 Ko nous donne le meilleur résultat global compte tenu du temps de copie et du gonflement:

dd if=srcFile of=dstFile iflag=direct oflag=direct bs=64K conv=sparse
Steve Amerige
la source
2
Bonjour Steve, veuillez diviser en question une réponse, voici comment fonctionnent les sites stackexchange.
bummi