为什么在 Mac OS X 中“/dev/rdisk”比“/dev/disk”快 20 倍

为什么在 Mac OS X 中“/dev/rdisk”比“/dev/disk”快 20 倍

根据rasbery pi 文档, 您可以使用 /dev/disk 或 /dev/rdisk 将您的操作系统加载到闪存卡中。

rdisk 代表原始磁盘。

/dev/disk 是块级设备,为什么 rdisk 会快 20 倍?

使用 Mac OSX

注意:在 OS X 中,每个磁盘在 /dev 中可能有两个路径引用:/dev/disk# 是缓冲设备,这意味着发送的任何数据都会经过额外处理。/dev/rdisk# 是原始路径,速度更快,使用 dd 程序时完全没问题。在 Class 4 SD 卡上,使用 rdisk 路径的速度大约快 20 倍。

答案1

man hdiutil

/dev/rdisk 节点是字符特殊设备,但在 BSD 意义上是“原始”的,并且强制使用块对齐 I/O。它们比缓冲区缓存更接近物理磁盘。另一方面,/dev/disk 节点是缓冲块特殊设备,主要由内核的文件系统代码使用。

通俗地说,数据/dev/rdisk几乎直接进入磁盘,并且/dev/disk经过更长更昂贵的路线

答案2

接受的答案是正确的,但没有详细说明。

当您从用户空间访问它们时,/dev/disk和之间的一个主要区别是是缓冲的。 的读/写路径将I/O 分解为块(x86 和 arm 上为 4KB,arm64 上为 16KB),将其读入缓冲区缓存,然后复制到用户空间缓冲区(然后发出下一个块大小的读取…)。这很好,因为您可以执行未对齐的读取和写入,而且它确实有效。相比之下,基本上只是将读取或写入直接传递给设备,这意味着 I/O 的开始和结束需要在扇区边界上对齐。/dev/rdisk/dev/disk/dev/diskPAGE_SIZE/dev/rdisk

如果您对 执行大于一个扇区的读取或写入/dev/rdisk,该请求将直接传递。较低层可能会将其分解(例如,由于 USB 协议中的最大有效负载大小,USB 会将其分解为 128KB 的片段),但您通常可以获得更大、更高效的 I/O。当进行流式传输时,例如通过dd,128KB 到 1MB 是相当不错的大小,可以在当前的非 RAID 硬件上获得接近最佳的性能。

的读取和写入路径所进行的缓存/dev/disk非常简单,几乎毫无意义。即使不是绝对必要的,它也会进行缓存;例如,如果设备可以进行内存映射并直接传输到应用程序的缓冲区中。它执行小 (4KB/16KB) I/O,这会导致大量的每次 I/O 开销。它不执行任何预读或后写。

答案3

对于 HDD 和 SSD 来说,它似乎/dev/disk/dev/rdisk工作原理不同。想检查一下 MicroSD 卡。刚刚将 2GB 磁盘映像写入 Sandisk Ultra MicroSD 64GB (https://www.amazon.com/gp/product/B073JYVKNX)。

重复测试多次,但结果稳定:17MB/秒对于/dev/diskvs20MB/秒/dev/rdisk。更改bs=1mbs=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)
    

然后我决定测试阅读速度:26MB/秒对于/dev/diskvs87MB/秒/dev/rdisk。更改bs=1mbs=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)
    

答案4

需要说明的是,至少在 macOS High Sierra 中,/dev/disk 似乎比 /dev/rdisk 快得多。运行 dd 或 ddrescue 时,我从磁性 HD 复制到 SSD 的吞吐量比较结果为使用 /dev/rdisk 时为 3.7MBps,使用 /dev/disk 时为 45MBps。因此,在更高版本的 macOS 中,最好使用 /dev/disk 而不是 /dev/rdisk 以获得最佳性能。

相关内容