dd를 병렬화하는 방법은 무엇입니까?

dd를 병렬화하는 방법은 무엇입니까?

dd현재 스파스 파일을 입력( if)으로, 파일을 출력( of)으로 호출하는 데 문제가 있습니다 conv=sparse. ddCPU의 1개 코어( Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz4개 코어 + 4개 Intel Hyperthreads)만(1개 코어의 100%) 사용하고 있는 것 같아서 병렬화가 가능한지 궁금합니다 dd. 나는 있었다

  • 살펴보니 info ddcorutils man dd8.23 ​​버전에는 내장 기능이 있는 것 같습니다.
  • sgp_dd패키지 에서 확인하지만 sg3-utils(내 요구 사항에 맞는지 이해하지 못한 채) 스파스 파일을 처리할 수 없는 것 같습니다.
  • dcfldd병렬화 기능이 없는 것 같습니다.

AFAIK

  • 여러 스레드에서 프로그램 부분을 내부적으로 처리하는 향상된 버전/포크(I/O 성능을 저하시키는 컨텍스트 변경 방지)가 선호됩니다.
  • 로컬에서 실행되는 GNU 솔루션이 parallel선호됩니다.
  • 사용자 정의(아마도 테스트되지 않은) 코드 조각

CPU가 I/O 집약적인 작업의 병목 현상을 방지하는 방법은 무엇입니까? Linux 3.13이 설치된 Ubuntu 14.04에서 명령을 실행하고 스파스 파일을 지원하는 모든 파일 시스템에서 스파스 파일 디스크 이미지를 처리하고 싶습니다(적어도 솔루션이 하나의 특정 파일 시스템에 바인딩되어서는 안 됩니다).

배경: zfs(zfsonlinux 0.6.4 불안정한 버전, 버그가 있을 수 있고 CPU 병목 현상의 원인(결국 느린 홀 검색)의 원인)에서 11TB 스파스 파일(약 2TB 데이터 포함)의 복사본을 만들려고 합니다. (매우 일반적인 방식으로) dd를 병렬화하는 방법에 대한 질문에는 아무 것도 바뀌지 않습니다.

답변1

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

이렇게 하면 파일을 4개의 3TB 청크로 논리적으로 분할하고 병렬로 처리해야 합니다. ( skip=입력 블록을 건너뛰고 seek=출력 블록을 검색합니다.) 네 번째 명령은 물론 이전 파일의 끝까지 읽으므로 매개 count=변수가 꼭 필요한 것은 아닙니다.

관련 정보