bs 매개 변수의 최적 값을 dd로 결정하는 방법이 있습니까?


71

"저는 기본값이 너무 오래 걸리기 때문에 'bs ='를 설정했는지 확인하십시오"라는 라인과 온라인에서 의견을 보았습니다. 지난 주에 " 따라서 'dd'(일반적으로 1-2GB 범위)를 사용할 때마다 bytes 매개 변수를 지정해야합니다. 복사하는 온라인 안내서에 지정된 값을 사용하는 시간의 약 절반 나머지 시간에는 'fdisk -l'목록에서 의미가있는 숫자를 선택하여 느린 미디어 (예 : 내가 쓰는 SD 카드)입니다.

주어진 상황 (미디어 유형, 버스 크기 또는 기타 중요한 사항)에 대해 "최상의"값을 결정하는 방법이 있습니까? 결정하기 쉬운가? 그렇지 않은 경우 90-95 %의 쉬운 방법이 있습니까? 아니면 정답 일지라도 "512보다 큰 것을 골라야"하는가?

나는 실험을 직접 시도하려고 생각했지만 (많은 작업 외에도) 어떤 요인이 답에 영향을 미치는지 잘 모르겠으므로 좋은 실험을 디자인하는 방법을 모르겠습니다.


동일한 저장 매체에 쓰는 것은 다른 저장 매체에 쓰는 것과 다르고 다른 최적 설정이 필요할 수 있습니다. 장치 유형, 속도, 캐시 등에 따라 모든 사람마다 다른 변수가 많이 있습니다. 내 컴퓨터에서 bs = 256M이 최적입니다.

답변:


27

dd이전 IBM 메인 프레임 테이프를 변환해야했던 날짜부터 시작하여 블록 크기가 테이프를 쓰는 데 사용 된 크기와 일치해야하거나 데이터 블록을 건너 뛰거나 잘 렸습니다. (9 트랙 테이프는 까다로 웠습니다. 오래 전에 죽어 다행입니다.) 요즘 블록 크기는 장치 섹터 크기의 배수 여야합니다 (보통 4KB이지만 최근 디스크에서는 훨씬 더 크고 작은 엄지 손가락으로 표시 될 수 있음) 드라이브 크기는 더 작을 수 있지만 4KB는 중간 수준에 관계없이 합리적인 수준이며 성능이 클수록 좋습니다. 나는 종종 하드 드라이브에 1MB 블록 크기를 사용합니다. (요즘에는 더 많은 메모리를 버릴 수 있습니다.)


하드 드라이브 또는 USB 대용량 저장 장치는 512 또는 4096 (최신) 바이트입니다. 광학 및 직접 액세스 플래시 미디어는 2048 바이트입니다. 4096 바이트로 잘못 될 수 없습니다.
LawrenceC

3
복사 프로그램의 블록 크기가 기본 장치의 특성 (탭 제외)과 관련이있는 이유는 무엇입니까? 커널은 자체 버퍼링 (때로는 프리 페치)을 수행합니다.
Gilles

1
분수 버퍼를 최소화하기 위해; 커널이 섹터 (또는 더 나은 트랙 또는 실린더에서 버퍼 읽기 / 쓰기를 시작할 수는 있지만 현대 드라이브가 그와 관련이 있다고 생각합니다)와 커널 버퍼 경계를 커널이 시작할 수 없기 때문에 정렬 된 버퍼를 사용할 때 일반적으로 더 빠릅니다. 내용을 건너 뛰거나 추가 내용을 읽거나 부분 버퍼를 관리합니다. 분명히 커널이 모든 것을 처리하도록 할 수는 있지만 기가 바이트의 데이터를 복사하는 경우 추가 작업으로 인해 복사 시간이 크게 단축 될 수 있습니다.
geekosaur

@Gilles댓글 회신에 대한 알림을 받으려면 일반적으로 포함시켜야 합니다. 댓글 @ 답장은 어떻게 작동합니까?를 참조하십시오 . . 내가지나 가기 때문에 : 커널은 어쨌든 그것을 처리 할 것입니다. “추가 작업으로 인해 복사 시간이 크게 단축 될 수있다”는 귀하의 주장은 저의 벤치 마크와 일치하지 않지만 시스템마다 다른 동작이있을 수 있으므로 타이밍도 기여하십시오!
Gilles

@Gilles : 죄송합니다. 원래 질문으로 당신을 착각했습니다.
geekosaur

60

최적의 블록 크기를 결정하는 한 가지 방법이 있으며 이는 벤치 마크입니다. 방금 빠른 벤치 마크를 만들었습니다. 테스트 머신은 커널 2.6.32 및 coreutils 8.5와 함께 데비안 GNU / 리눅스를 실행하는 PC입니다. 관련된 두 파일 시스템은 하드 디스크 파티션의 LVM 볼륨에서 ext3입니다. 소스 파일은 2GB입니다 (정확히 2040000kB). 캐싱 및 버퍼링이 활성화되었습니다. 각 실행 전에으로 캐시를 비 웁니다 sync; echo 1 >|/proc/sys/vm/drop_caches. 런타임에는 sync버퍼를 플러시 하는 최종 단계 가 포함되지 않습니다 . 마지막 sync은 1 초 정도 걸립니다. same실행은 동일한 파일 시스템에 복사했다; diff실행은 다른 하드 디스크에있는 파일 시스템에 복사했다. 일관성을 위해보고 된 시간은time유틸리티 (초) 각 명령을 한 번만 실행했기 때문에 타이밍에 얼마나 많은 차이가 있는지 모릅니다.

             same   diff
dd bs=64M    71.1   51.3
dd bs=1M     73.9   41.8
dd bs=4k     79.6   48.5
dd bs=512    85.3   48.9
cat          76.2   41.7
cp           77.8   45.3

결론 : 큰 블록 크기 (수 메가 바이트)가 도움이되지만 크게 향상되지는 않습니다 (동일한 드라이브 사본에 대해 예상했던 것보다 훨씬 적음). 그리고 cat그리고 cp너무 심하게 수행하지 않습니다. 이 숫자로 dd귀찮게 할 가치 가 없습니다 . 가자 cat!


OP가 자체 벤치마킹을 수행하는 것이 좋지만 어쨌든 좋은 대답입니다!
ninjalj

5
@Nikhil >|>아래 set -o noclobber에서 셸은 파일을 사용하면 파일이 존재한다고 불평합니다 >.
Gilles

2
@Masi 예, 전체 디스크를 복제하려면을 사용 cat합니다. 왜 더 나은 방법을 찾고 있습니까? 무슨 일이야 cat?
Gilles

5
@Masi cat는 입력을 출력으로 복사합니다. 신뢰할 수없는 미디어에서 복사하고 읽을 수없는 부분을 건너 뛰거나 여러 번 다시 시도하려는 경우 다른 문제입니다.이 문제 ddrescue는 꽤 잘 작동합니다.
Gilles

1
@sudo로 복사 한 데이터 양을 얻을 수 있습니다 lsof. 순간 속도는 균일 한 디스크 복사와 관련이 없으므로 경과 된 시간으로 전송 된 바이트를 나눌 수 있습니다. 더 나은 것을 원하면을 사용할 수 있습니다 pv.
Gilles

8

나는 크기가 블록 크기의 배수가되어야한다는 geekosaur에 동의하는데, 이는 종종 4K입니다.

블록 크기를 찾으려면 stat -c "%o" filename가장 쉬운 옵션 일 것입니다.

그러나 당신이 그렇게 말한다면 dd bs=4K, 그것은 read(4096); write(4096); read(4096); write(4096)...

각 시스템 호출에는 약간의 오버 헤드가 포함 된 컨텍스트 전환이 포함되며 I / O 스케줄러에 따라 산재 된 쓰기로 디스크를 검색하면 디스크가 많이 검색 될 수 있습니다. (아마도 Linux 스케줄러의 주요 문제는 아니지만 고려해야 할 사항입니다.)

따라서 그렇게하면 bs=8K디스크가 한 번에 두 개의 블록을 읽도록 할 수 있습니다. 디스크에서 다른 곳에 쓰기를 시도하기 전에 (또는 다른 프로세스에 대해 I / O를 서비스하기 위해) 디스크에서 서로 가까이있을 수 있습니다.

그 논리에 의해 bs=16K더 좋습니다.

그래서 내가 알고 싶은 것은 성능이 악화되기 시작하는 상한이 있거나 메모리에 의해서만 제한되는 경우입니다.


4
프로필, 추측하지 마십시오!
Gilles

1
Linux Programming Interface가 동의합니다. 13 장-파일 I / O 버퍼링을 참조하십시오.
Mikel

4
흥미롭게도 벤치 마크 결과 4K 이상의 이점은 거의 없습니다.
Mikel

4
또한 기본 파일 미리 읽기 창은 128KB이므로 값이 유리할 수 있습니다.
Mikel

6
나는 학사가 = 8K 나에게 1백97메가바이트 / S를 얻을 수 있지만, 학사 = 1M 나에게 2.2 얻을 여기에 24 드라이브 RAID50에 대한 액세스가 GB / S 는 RAID의 이론적 처리량에 가깝습니다. 따라서 bs는 중요합니다. 그러나 bs = 10M을 사용하면 1.7GB / s 만 얻습니다. 따라서 일부 임계 값을 초과하면 악화되는 것처럼 보이지만 이유는 확실하지 않습니다.
Joseph Garvin

5

질이 말했듯이, 당신은을위한 최적의 매개 변수를 확인할 수 있습니다 학사 하는 옵션 dd는 벤치마킹에 의해합니다. 그러나 이것은 다음과 같은 질문을 제기합니다. 어떻게이 매개 변수를 편리하게 벤치마킹 할 수 있습니까?

이 질문에 대한 임시 답변은 다음과 같습니다. dd-opt 사용 , 최근 에이 문제를 정확하게 해결하기 위해 노력한 유틸리티 :)


1
출력 감도는 얼마입니까? 90-95 % 또는> 95 %? 나는 당신이 그것을 바꿀 수 있다고 생각하지 않습니다.
Léo Léopold Hertz 준영

1
@Masi, 나는 dd-opt오랫동안 일하지 않은 것이 두려워 . 그러나 AGPLv3에 따라 라이센스가 부여 된 무료 소프트웨어 입니다 . 따라서 자유롭게 개선하고 감도 / 정확도를 증발 시키십시오!
sampablokuper

0

에서 가장 잘 작동하는 것 같은 sdcard 리더 usb2.0에 최적화되었습니다 bs=10M. 나는 8-10M 후에 개선없이 4M, 최대 16M에 시도했다. 전송 속도 측정이 어떻게 저하되는지 확인할 수 있습니다. 장치에 버퍼를로드 한 다음 장치가 실제 매체로 전송 될 때까지 기다릴 가능성이 높습니다.

angstrom/sdcard# dd if=/dev/zero of=/dev/sdb bs=10M
123+0 records in
123+0 records out
1289748480 bytes (1.3 GB) copied, 21.4684 s, 60.1 MB/s
341+0 records in
341+0 records out
3575644160 bytes (3.6 GB) copied, 117.636 s, 30.4 MB/s
816+0 records in
816+0 records out
8556380160 bytes (8.6 GB) copied, 326.588 s, 26.2 MB/s
955+0 records in
955+0 records out
10013900800 bytes (10 GB) copied, 387.456 s, 25.8 MB/s
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.