Как распараллелить дд?

10

В настоящее время у меня проблемы с ddвызовом разреженного файла в качестве input ( if) и файла в качестве output ( of) с conv=sparse. ddпохоже, что используется только одно ядро ​​ЦП ( Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz4 ядра + 4 Intel Hyperthreads) (100% от 1 ядра), поэтому мне было интересно, возможно ли распараллеливание dd. Я был

  • глядя в info ddи man ddи там , кажется , встроенной функции в версии 8.23 corutils
  • проверка sgp_ddиз sg3-utilsпакета (не понимая, подходит ли он моим потребностям), но, похоже, он не в состоянии обрабатывать разреженные файлы
  • dcfldd не похоже на возможности распараллеливания

насколько мне известно

  • расширенная версия / ветвь с внутренней обработкой программных частей в нескольких потоках (избегайте изменений контекста, снижающих производительность ввода-вывода) предпочтительнее, чем
  • решение с GNU, parallelработающим локально, предпочтительнее
  • пользовательский (возможно, не проверенный) фрагмент кода

Как избежать того, чтобы процессор был узким местом интенсивной операции ввода-вывода? Я хотел бы запустить команду в Ubuntu 14.04 с Linux 3.13 и обрабатывать с ней разреженные образы файловых файлов на любой файловой системе, поддерживающей разреженный файл (по крайней мере, решение не должно быть привязано к одной конкретной файловой системе).

Предыстория: я пытаюсь создать копию разреженного файла размером 11 ТБ (содержащего около 2 ТБ данных) на zfs (нестабильная версия zfsonlinux 0.6.4, возможно, глючит и причина узкого места ЦП (в конечном итоге медленный поиск дырок)). Это ничего не должно изменить в вопросе о том, как распараллелить dd (очень общим способом).

Карл Рихтер
источник
Я не вижу, что вы могли бы извлечь из этого, поскольку эта операция связана с вводом / выводом, за исключением крайних случаев. На мой взгляд, лучшим вариантом была бы программа, которая редко знает, например что-то вроде xfs_copy . На его странице руководства упоминается: «Однако, если файл создается в файловой системе XFS, файл занимает примерно то пространство, которое фактически используется в исходной файловой системе файловой системой и журналом XFS. Экономия пространства происходит потому, что xfs_copy ищет свободные блоки вместо их копирования файловая система XFS эффективно поддерживает разреженные файлы. "
Кристиан Чиупиту
@mikeserv Я не понимаю твой комментарий ...
Карл Рихтер
@CristianCiupitu Ну, в моем случае узким местом является центральный процессор - не спрашивайте меня почему, потому что я не знаю. Ваш ответ заставил меня осознать, что решение должно поддерживать несколько файловых систем (способных обрабатывать разреженные файлы) (отредактировано)
Карл Рихтер
Какой у вас процессор и файловая система? Насколько большой файл (длина и блоки)?
Кристиан Чиупиту
4
ddпо умолчанию загружает процессор из-за небольшого размера блока. сделать его больше, как bs=1M.
frostschutz

Ответы:

4

Протестировано в Bash:

INFILE=in
seq 0 1000 $((`stat --format %s $INFILE` /100000 )) |
  parallel -k dd if=$INFILE bs=100000 skip={} conv=sparse seek={} count=1000 of=out

Вам, вероятно, нужно настроить 1000.

Оле Танге
источник
2

Подходит один нестандартный, непроверенный фрагмент кода:

dd if=oldf conv=sparse bs=1k                 count=3000000000                 of=newf &
dd if=oldf conv=sparse bs=1k skip=3000000000 count=3000000000 seek=3000000000 of=newf &
dd if=oldf conv=sparse bs=1k skip=6000000000 count=3000000000 seek=6000000000 of=newf &
dd if=oldf conv=sparse bs=1k skip=9000000000 count=3000000000 seek=9000000000 of=newf &
wait

Это должно логически разделить файл на четыре блока по 3 ТБ и обрабатывать их параллельно. ( skip=пропускает входные блоки; seek=ищет выходные блоки.) Четвертая команда, конечно, будет считывать до конца старого файла, поэтому count=параметр не является строго обязательным.

G-Man говорит: «Восстанови Монику»
источник
Я тоже думал о некоторых подобных вещах, но не мог понять, как сделать это универсальным решением для файлов произвольного размера (фон вопроса не должен был повлиять на мой запрос универсального решения)
Карл Рихтер,
Я не понимаю, что вы говорите. Я просто взял заявленный размер вашего файла и поделил на количество ядер. Это может быть тривиально с помощью сценария.
G-Man говорит: «Восстанови Монику»
3
наверно тоже нуженconv=notrunc
frostschutz
@frostschutz: Может быть, только первый. Хотя я не могу найти это документированным, мое тестирование показывает, что conv=notruncподразумевается seek=с положительным значением.
G-Man говорит: «Восстановите Монику»
1
нет, искать не значит notrunc.
frostschutz