dd 시계가 매우 느리게(12초마다) 똑딱거린다는 것은 무엇을 의미합니까?

dd 시계가 매우 느리게(12초마다) 똑딱거린다는 것은 무엇을 의미합니까?

여기에 Intenso 외장 1TB 2.5" HDD가 있습니다. 일종의 결함(Windows에서 무작위로 연결이 끊어지는 현상)이 발생했기 때문에 다음 명령을 실행하여 확인하기로 결정했습니다.

dd if=/dev/sdb of=/dev/null bs=4M status=progress

실행 시 출력은 다음과 같습니다.

715099471872 Bytes (715 GB, 666 GiB) kopiert, 16115 s, 44,4 MB/s

44.4MB/s는 USB3 디스크에 비해 너무 느리다는 사실 외에도 이상한 점은 시계가 12초마다 똑딱거린다는 것입니다. ("16115 s"는 dd 시계입니다.) 정상적인 디스크에서 동일한 명령을 실행하면 매초마다 틱합니다.

왜 그렇게 오랫동안 차단되는지 이해하려고 노력 중이지만 strace메모리 매핑을 통해 디스크에서 읽는 것 같아서 아무것도 볼 수 없습니다.

디스크가 읽는 동안 단순히 12초 동안 차단하는 것도 불가능합니다. 속도가 44.4MB/s이므로 블록 크기는 4MB입니다. 따라서 dd는 매초 시계를 업데이트할 기회가 11번 있습니다.

그렇다면 여기서 정확히 무슨 일이 일어나고 있는 걸까요?

(디스크에 무슨 문제가 있는지 관심은 없지만 dd 시계가 왜 이렇게 느리게 가는지 궁금합니다. 그러니 SE Unix가 맞기를 바랍니다.)

답변1

dd해당 디스플레이는 복사 작업 사이에만 업데이트될 수 있습니다. 실제로 GNU coreutils를 사용하면 dd.c메인 while루프가 다음과 같이 단순화된다는 것을 알 수 있습니다.

int dd_copy() {
  // some setup
  while(true) {
    if(progress_reporting_enabled && minimum_time_passed) {
      print_xfer_stats();
    }
    copy_a_block;
  }
}

블록을 복사하는 데 반복당 12초가 걸린다면할 수 없다시각적 업데이트를 받으세요.

솔직히 dd이것은 전혀 사용하고 싶은 프로그램이 아닙니다(많은 경우, 특히).

pv /dev/sdb > /dev/null

실제로 4MB 블록을 읽고 싶다면 더 이해하기 쉬울 것입니다(이유는 무엇입니까? 하드 드라이브에는 아마도 1024개의 B 블록이 있고 USB 전송은 훨씬 작으므로 더 큰 전송의 경우 속도가 매우 감소합니다).

pv -B 4M /dev/sdb > /dev/null

(디스크에 관심이 없다고 말씀하셨고 왜 dd이런 일이 발생하는지에 대해 질문하셨지만, 미래의 독자들을 위해 하드 드라이브에 오류가 발생하고 있습니다 :)
하지만,더 높은 관점에서: 귀하는 손상된 하드 드라이브를 다루고 있습니다. 내용을 백업하는 경우를 제외하고는 가능한 한 적게 사용하는 것이 좋습니다.

관련 정보