Qual è il modo più veloce per copiare un file sparse? Quale metodo risulta nel file più piccolo?


11

BACKGROUND : sto copiando un'immagine VM qcow2 sparsa che ha dimensioni di 200 GB, ma ha 16 GB di blocchi allocati. Ho provato vari metodi per copiare questo file sparse all'interno dello stesso server e ho ottenuto alcuni risultati preliminari. L'ambiente è RHEL 6.6 o CentOS 6.6 x64.

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

Via cp - la migliore velocità

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 - il miglior interprete generale

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 - dimensione migliore

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

Variante Blocksize

Ero preoccupato per il 'gonfio' durante la copia dd (aumento della dimensione del file dall'originale), quindi ho variato la dimensione del blocco. Ho usato 'time' per ottenere anche il tempo totale e la CPU%. Il file originale in questo caso è un file sparso da 200 GB da 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

DOMANDA : Puoi verificare che ho identificato i metodi migliori per copiare un file sparse per ottenere le migliori prestazioni complessive? Tutti i suggerimenti su come farlo meglio sono i benvenuti così come le eventuali preoccupazioni che potresti avere con i metodi che sto usando.


L'unico altro che proverei, dati i tuoi lodevoli sforzi, è rsync con l'opzione --sparse. È anche possibile che diverse dimensioni del blocco in dd migliorino la sua velocità o gonfia.
mpez0,

Anche il tar è buono da provare
Olivier Dulac il

@OlivierDulac Ho provato tar, ma questo era un artista così povero che non l'ho nemmeno incluso. Avrei dovuto. Quanto sopra sono copie locali. Aggiungerò la rete copiando i dati delle prestazioni per una rete da 10 Gbps, copiando nella stessa sottorete. Una volta che lo avrò, penso che avrò abbastanza dati per trarre una conclusione realizzabile per la quale è la migliore interprete generale.
Steve Amerige,

rsync supporta anche --sparse per fare questo stile di copia. Potresti provare questo. Ha anche il vantaggio di essere misurabile sia sulla copia locale che su quella di rete.
Travis Campbell,

@TravisCampbell Ho aggiunto i dati per rsync. È stato il peggior esecutore di tutti i test che ho eseguito.
Steve Amerige,

Risposte:


5

Dal benchmark precedente, sembra che l'uso di dd sul nostro hardware di destinazione con una dimensione di blocco di 64 KB ci dia il miglior risultato complessivo considerando il tempo di copia e il gonfio:

dd if=srcFile of=dstFile iflag=direct oflag=direct bs=64K conv=sparse

2
Ciao Steve, ti preghiamo di dividere in domanda una risposta, ecco come funzionano i siti di stackexchange.
bummi,
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.