Какой самый быстрый способ скопировать разреженный файл? Какой метод приводит к наименьшему файлу?

11

ПРЕДПОСЫЛКИ : Я копирую разреженный образ виртуальной машины qcow2, который имеет размер 200 ГБ, но имеет 16 ГБ выделенных блоков. Я пробовал различные методы, чтобы скопировать этот разреженный файл на одном сервере и получить некоторые предварительные результаты. Окружающая среда RHEL 6,6 или CentOS 6,6 x64.

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

Via CP - лучшая скорость

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 - лучший исполнитель

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)

Через 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)

Через virt-sparsify - лучший размер

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

Изменяющийся размер блока

Я был обеспокоен «раздуванием» во время копирования dd (увеличение размера файла по сравнению с оригиналом), поэтому я изменил размер блока. Я использовал «время», чтобы также получить общее время и процент загрузки процессора. Исходный файл в этом случае представляет собой редкий файл размером 200 ГБ, равный 7,3 ГБ:

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

ВОПРОС : Можете ли вы проверить, что я определил лучшие методы для копирования разреженного файла, чтобы получить лучшую общую производительность? Любые предложения о том, как сделать это лучше, приветствуются, как и любые проблемы, которые могут возникнуть у вас с методами, которые я использую.

Стив Америдж
источник
Единственное, что я попробую, учитывая ваши похвальные усилия, это rsync с опцией --sparse. Также возможно, что другой размер блока в dd улучшит его скорость или раздувание.
mpez0
Тар тоже хороший вариант
Оливье Дюлак
@OlivierDulac Я попробовал tar, но это был настолько плохой исполнитель, что я даже не включил его. Мне следует иметь. Выше приведены локальные копии. Я добавлю данные о производительности сетевого копирования для сети 10 Гбит / с, копируя в той же подсети. Как только я получу это, думаю, у меня будет достаточно данных, чтобы сделать работоспособное заключение, для которого лучший исполнитель в целом.
Стив Америг
rsync также поддерживает --sparse для выполнения этого стиля копирования. Вы можете попробовать это. Также имеет дополнительное преимущество измеримости при локальном и сетевом копировании.
Трэвис Кэмпбелл
@TravisCampbell Я добавил данные для rsync. Это был худший исполнитель из всех испытаний, которые я проводил.
Стив Америдж

Ответы:

5

Из вышеприведенного бенчмаркинга похоже, что использование dd на нашем целевом оборудовании с размером блока 64K дает нам лучший общий результат с учетом времени копирования и раздувания:

dd if=srcFile of=dstFile iflag=direct oflag=direct bs=64K conv=sparse
Стив Америдж
источник
2
Привет Стив, пожалуйста, разделите на вопрос ответ, вот как работают стек-сайты обмена.
Бумми