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

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

dd현재 희소 파일을 input( if)으로 사용하고 파일을 output( )으로 사용 of하여 호출하는 데 문제가 있습니다 conv=sparse. ddCPU 코어 1개( Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz4코어+인텔 하이퍼스레딩 4개)(1코어 100%)만 사용하는 것 같아서 병렬화가 가능한지 궁금합니다 dd. 나 거기 가봤 어

  • 살펴보면 corutils 버전 8.23에 내장 기능이 있는 것 같습니다 info dd.man dd
  • sgp_dd패키지에서 확인했지만 sg3-utils(내 요구 사항에 맞는지 모르겠습니다) 희소 파일을 처리하지 않는 것 같습니다.
  • dcfldd병렬화 기능이 없는 것 같습니다.

AFAIK

  • 다중 스레드에서 프로그램 일부의 내부 처리보다 향상된 버전/분기(컨텍스트 변경으로 인해 I/O 성능이 저하되는 것을 방지하기 위해)
  • GNU를 로컬에서 실행하기 위한 솔루션은 parallel다음보다 낫습니다.
  • 사용자 정의(테스트되지 않은) 코드 조각

I/O 집약적인 작업으로 인해 CPU가 병목 현상을 일으키는 것을 방지하는 방법은 무엇입니까? 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=매개변수가 꼭 필요한 것은 아닙니다.

관련 정보