Mac OS X에서“/ dev / rdisk”가“/ dev / disk”보다 약 20 배 빠른 이유


129

rasbery pi documentation 에 따르면 / dev / disk 또는 / dev / rdisk를 사용하여 OS를 플래시 카드에로드 할 수 있습니다.

rdisk는 원시 디스크를 나타냅니다.

/ dev / disk는 블록 레벨 장치인데 왜 rdisk가 20 배 더 빠를까요?

Mac OSX 사용

참고 : OS X의 각 디스크에는 / dev에 두 개의 경로 참조가있을 수 있습니다. / dev / disk #는 버퍼링 된 장치이므로 전송되는 모든 데이터에 추가 처리가 수행됩니다. / dev / rdisk #는 dd 프로그램을 사용할 때 훨씬 빠르며 완벽하게 작동하는 원시 경로입니다. 클래스 4 SD 카드에서 rdisk 경로를 사용하면 차이가 약 20 배 빨라졌습니다.


3
부수적으로, 나는 테스트를 실행했고 rdisk는 실제로 훨씬 오래 걸렸다.
spuder

4
다른 참고 사항으로, 나는 그때도 테스트해야한다고 느꼈고 rdd 사본 (dd를 통해)이 디스크 상대를 사용하는 것보다 거의 정확히 4 배 빠릅니다.
Travis Griggs

Mac OSX 10.9.1 (MacBook Pro 15 인치, 2011 년 초)
Travis Griggs

2
필자가 읽고있는 Raspberry Pi SD 카드 이미지에 대한 일부 지침에서 "rdisk"가 오타라고 생각했습니다. 추가 조사를 통해 차이를 확인 하고이 스레드를 발견했습니다. 제 경우에는 / dev / disk 대신 / dev / rdisk를 사용하여 1.7GB 이미지를 SD 카드에 쓰는 것이 13 배 더 빠릅니다! 맥북 프로 레티 나 13 ", 2015 년 초 모델.
tobias.mcnulty

2
또 다른 참고 사항으로, 새로 구입 한 Sandisk Extreme Pro MicroSD 카드에 Ubuntu ARM 이미지를 추가했습니다. / dev / disk1은 2.3MB / s로 기록되었지만 / dev / rdisk1은 83.7MB / s로 기록되었습니다 (36.4 배 빠름).
DanielSmedegaardBuus

답변:


93

보낸 사람 man hdiutil:

/ dev / rdisk 노드는 문자 특수 장치이지만 BSD 의미에서 "원시"이며 블록 정렬 I / O를 강제합니다. 버퍼 캐시보다 실제 디스크에 더 가깝습니다. 반면에 / dev / disk 노드는 버퍼링 된 블록 전용 장치이며 주로 커널의 파일 시스템 코드에서 사용됩니다.

평신도의 용어 /dev/rdisk는 거의 직접 디스크로 /dev/disk이동하고 더 비싼 경로를 통과합니다.


14
rdisk를 사용할 수 있는데 왜 디스크를 사용합니까?
user391339

20
캐싱은 여전히 ​​바람직한 것이므로 @ user391339 이동식 미디어가있는 경우 다른 물리적 위치에 데이터를 원하기 때문에 물리적 장치의 데이터를 가능한 빨리 가져 오려고합니다. 내장 하드 드라이브는 다른 이야기입니다. 당신은 보통 그것들을 가지고 다니지 않기 때문에 데이터가 실제로 장치에 쓰여질 때 신경 쓰지 않습니다. 디스크에 쓰는 데 비용이 많이 드는 장치에서 쓰거나 읽은 데이터를 캐시 할 때 프로그램이 더 빠릅니다. 프로그램에서 쓰려는 모든 데이터가 디스크에 쓰여질 때까지 기다릴 필요가 없기 때문입니다.
Kritzefitz

@Dan, Re "force"; 의미?
Pacerier

Krit의 설명이 저에게 도움이되는지 확실하지 않습니다. 제 경우는 더 빠른 대용량 외부 디스크 일회성 스캔을 원하고 약간 특별한 방법 일지 모르겠지만 정상적인 사용에서는 여전히 괜찮으며 일반적인 방법으로 꺼내기를 기다립니다. 연습. 그러나 Windows에서는 항상 예기치 않은 연결 손실 이벤트에서 파일 시스템 손상이 적다는 것을 광고하기 때문에 Mac의보다 '원시'모드를 반영하는 '빠른 분리'프로필을 선호했습니다.
Pysis

96

받아 들여진 대답은 옳지 만 세부 사항은 아닙니다.

사용자 공간에서 /dev/disk와와 의 주요 차이점 중 하나 는 버퍼링 된 것입니다. 읽기 / 쓰기 경로 는 I / O를 4KB 청크로 분할하여 버퍼 캐시로 읽은 다음 사용자 공간 버퍼에 복사 한 후 다음 4KB 읽기…를 실행합니다. 이것은 정렬되지 않은 읽기 및 쓰기를 수행 할 수 있다는 점에서 훌륭하며 작동합니다. 반대로 기본적으로 읽기 또는 쓰기를 장치로 바로 전달하기 때문에 I / O의 시작과 끝이 섹터 경계에서 정렬되어야합니다./dev/rdisk/dev/disk/dev/disk/dev/rdisk

에 하나 이상의 섹터를 읽거나 쓰면 /dev/rdisk해당 요청이 바로 전달됩니다. 하위 계층은 계층을 손상시킬 수 있지만 (예 : USB는 USB 프로토콜의 최대 페이로드 크기로 인해 128KB 조각으로 분할) 일반적으로 더 크고 효율적인 I / O를 얻을 수 있습니다. 을 통해 스트리밍 할 때 dd128KB ~ 1MB는 ​​현재 비 RAID 하드웨어에서 거의 최적의 성능을 얻을 수있는 크기입니다.

/dev/disk의 읽기 및 쓰기 경로에 의해 수행되는 캐싱 은 매우 간단하고 거의 두뇌가 죽었습니다. 꼭 필요한 것은 아니지만 캐시합니다. 기기가 메모리를 매핑하여 앱의 버퍼로 직접 전송할 수있는 경우처럼 작은 (4KB) I / O를 수행하므로 많은 I / O 오버 헤드가 발생합니다. 미리 읽거나 쓰지 않습니다.


6

보인다 /dev/disk/dev/rdiskHDD 및 SSD를 다른 작동합니다. MicroSD 카드를 확인하고 싶습니다. Sandisk Ultra MicroSD 64GB에 2GB 디스크 이미지를 썼습니다 ( https://www.amazon.com/gp/product/B073JYVKNX ).

반복 몇 가지 테스트 시간,하지만 결과는 안정 : 17메가바이트 / S를 위한 /dev/disk20메가바이트 / S 에 대한 /dev/rdisk. 변경 bs=1m하려면 bs=16m절대적으로 쓰기 속도의 차이를 제공하지 않습니다.

  1. 에 쓰기 /dev/disk2

    sudo dd if=~/Downloads/ubuntu-18.04-4.14-minimal-odroid-xu4-20180531.img of=/dev/disk2 bs=1m
    2094006272 bytes transferred in 121.860007 secs (17183704 bytes/sec)
    
  2. 에 쓰기 /dev/rdisk2

    $ sudo dd if=~/Downloads/ubuntu-18.04-4.14-minimal-odroid-xu4-20180531.img of=/dev/rdisk2 bs=1m
    2094006272 bytes transferred in 102.743870 secs (20380839 bytes/sec)
    

그럼 내가 읽기 속도를 테스트하기로 결정 26메가바이트 / S를 위한 /dev/disk87메가바이트 / S 에 대한 /dev/rdisk. 변경 bs=1m하려면 bs=16m절대적으로 읽기 속도의 차이를 제공하지 않습니다.

  1. 에서 읽기 /dev/disk2

    sudo dd if=/dev/disk2 of=~/Downloads/ubuntu-18.04-4.14-minimal-odroid-xu4-20180531-2.img bs=1m
    257949696 bytes transferred in 9.895572 secs (26067184 bytes/sec)
    
  2. 에서 읽기 /dev/rdisk2

    $ sudo dd if=/dev/rdisk2 of=~/Downloads/ubuntu-18.04-4.14-minimal-odroid-xu4-20180531.img bs=1m
    877658112 bytes transferred in 10.021974 secs (87573377 bytes/sec)
    

2

나는 이것이 오래된 스레드라는 것을 알고 있지만 다른 사람들은 내가 시도한 것의 속도 영향에 관심이있을 수 있습니다. macOS 및 BOOTCAMP 파티션을 모두 캡처하려는 MacBook Pro 13 "Retina (Silicon Power 1 TB SSD 사용)의 내부 SSD를 외부 USB 3.0 2.5"하드 디스크 드라이브에 백업하고 싶습니다. 내 초기 명령 줄은 다음과 같습니다.

sudo dd if=/dev/disk0 of=/dev/disk2 bs=1m

결과는 ~ 31.3MB / 초의 복사 속도였습니다. 기다리기 엔 너무 길었어 따라서 두 번째 시도에서 명령 행은 다음과 같습니다.

sudo dd if=/dev/rdisk0 of=/dev/rdisk2 bs=1m

약 98.4MB / 초로 크게 속도를 올리는 /dev/rdisk대신 사용 /dev/disk! 그러나 더 좋아집니다. 따라서 세 번째 시도에는 다음 명령 줄을 사용했습니다.

sudo dd if=/dev/rdisk0 of=/dev/rdisk2 bs=1m conv=sparse

sparse 옵션은 DD에게 입력에서 모두 0 인 출력 블록에 쓰지 않아도됩니다. 멋진 점은 디스크의 "전체"영역 중간에있는 동안에도 생각보다 훨씬 빠릅니다. 꽉 차지 않은 드라이브에는 0의 큰 덩어리가 생겨 DD 속도가 더 빨라집니다. 적어도 지금까지 DD는 내 하드 디스크의 이론적 전송 속도로 ~ 116.4MB / 초로 실행되지만 아직 큰 빈 영역에 도달하지 못했습니다.

이 옵션을 시도해보십시오 – 작동합니다! 참고 : (Mac의 경우)에 나열된 올바른 드라이브를 주의해서 변경 if=하고  of=올바르게 가리 키 십시오 .

diskutil list

1
conv=sparse파일을 복사 할 때 좋습니다 .    나는 복사 할 때 손상을 소개 할 수 있다는 우려 될 거라고 전체 디스크, 파티션 또는 파일 시스템을 , 당신은 대상 디스크에 제로만을 포함하지 않는 것이 100 % 확실하게 알지 못한다.
G-Man

1

레코드의 경우 적어도 macOS High Sierra에서는 / dev / disk가 / dev / rdisk보다 훨씬 빠릅니다. dd 또는 ddrescue를 실행하면, 자기 HD에서 SSD로 복사하는 처리량 비교는 / dev / rdisk를 사용하는 3.7MBps, / dev / disk를 사용하는 45MBps입니다. 따라서 이후 버전의 macOS에서는 최상의 성능을 위해 / dev / rdisk 대신 / dev / disk를 사용하는 것이 가장 좋습니다.


2
내장 SSD 스토리지에서 dd 및 SD가 1MB 인 / dev / rdisk가있는 SD 카드에 4.6GB의 라스 비안 스트레치 이미지를 쓰는 동안 macOS 10.13.2를 실행하는 2013 년 말 맥북 프로에서 여전히 / dev / disk보다 훨씬 더 빠르게 수행됩니다. / dev / disk는 27.16 분, / dev / rdisk는 5.18 분 밖에 걸리지 않았습니다.
디지털 중독

@digitaladdictions는 최신 macOS에서 몇 가지 테스트를 수행했습니다. superuser.com/a/1346063/126537
k06a

0

나는 어느 경로 노드가 더 빠르거나 직렬 테스트에 뛰어들 것인지 논쟁하기 전에 생각합니다. 최종 읽기 / 쓰기 속도에 큰 영향을 미치는 다른 요소를 고려해야합니다.

Micro SD 카드 사양, 클래스 4 / 10 / HC I ... SD 카드 리더 칩 및 인터페이스, USB 1.1 / 2.0 / 3.0 / 3.1 os 전체 메모리 / 사용 가능한 메모리, os로드, os 하드 디스크 유형, HDD / SSD, HDD 회전 속도 및 캐시 크기, SSD 크기 / 캐시 / 여유 공간 / OS 하드 디스크 인터페이스, ata / sata / esata,

어떤 요소가 병목 현상이 발생하면 잘못된 결론을 얻게됩니다.

내 결과는 다음과 같습니다. osx 10.12.6, ssd,

usb 2.0 카드로 microSD 16G를 읽고 usb 3.0으로 외부 3.5 인치 HDD에 읽고,

15193+1 records in
15193+1 records out
15931539456 bytes transferred in 1423.067033 secs (11195214 bytes/sec)

내부 카드 읽기를 통해 microSD 32G 쓰기 및 데이터 소스는 USB 3.0으로 외부 3.5 인치 HDD,

0+253945 records in
0+253945 records out
15931539456 bytes transferred in 440.093686 secs (36200336 bytes/sec)

당신은 볼 수 있습니다, 쓰기 속도> 읽기 속도 !!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.