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


129

根据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倍。


3
附带说明,我进行了测试,而rdisk实际上花费了更长的时间。
spuder

4
另外,我觉得那时我也必须测试,发现rdisk复制(通过dd)几乎比使用磁盘副本快4倍。
Travis Griggs 2014年

Mac OSX 10.9.1(MacBook Pro 15英寸,2011年初)
Travis Griggs

2
我以为“ rdisk”是我正在阅读的Raspberry Pi SD卡图像的某些说明中的错字。经过进一步调查,我搜索了差异并找到了该线程。在我的情况下,使用/ dev / rdisk而不是/ dev / disk将1.7GB图像写入SD卡的速度提高了13倍!MacBook Pro的视网膜13" ,2015年的早期型号。
tobias.mcnulty

2
作为另一个说明,我刚刚将Ubuntu ARM映像添加到新购买的Sandisk Extreme Pro MicroSD卡中。/ dev / disk1的写入速度为2.3 MB / s,而/ dev / rdisk1的写入速度为83.7 MB / s,或速度的36.4倍。
DanielSmedegaardBuus

Answers:


93

来自man hdiutil

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

用外行的话来说/dev/rdisk,它几乎直接进入磁盘,/dev/disk并通过更长的更昂贵的途径


14
为什么可以使用rdisk时使用磁盘?
user391339 2015年

20
@ user391339因为缓存仍然是可取的事情。如果您有可移动介质,则希望尽快在物理设备上获取数据,因为您希望数据在另一个物理位置。内部硬盘驱动器则不同。通常,您不会随身携带这些数据,因此您不必担心何时将数据实际写入设备。当您缓存写入设备或从设备读取的数据时,这是写入磁盘的一种较昂贵的方法,但是您的程序仍然更快,因为它们不需要等到要写入的所有数据都写入磁盘后,才可以。
克里策夫兹

@ Dan,Re“强制”;含义?
Pacerier's

不确定Krit的解释对我有用。我的情况可能有点特殊,想进行一次较大的外部磁盘一次更快的扫描,而且我不确定哪种方法更好,但是我仍然可以正常使用并等待它弹出,这很常见。实践。但是,在Windows中,我始终首选“快速拔出”配置文件,我猜想它反映了Mac的“原始”模式,因为它在意外的连接丢失事件中通告了较少的文件系统损坏。
Pysis

96

公认的答案是正确的,但是并没有涉及太多细节。

从用户空间访问/dev/disk/dev/rdisk时,和之间的主要区别之一/dev/disk是缓冲。的读/写路径/dev/disk将I / O分解为4KB块,然后将其读入缓冲区高速缓存,然后复制到用户空间缓冲区中(然后发出下一个4KB读取…)。这样做很不错,因为您可以执行未对齐的读取和写入,并且可以正常工作。相反,/dev/rdisk基本上只是将读取或写入直接传递给设备,这意味着I / O的开始和结束需要在扇区边界上对齐。

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

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


6

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

反复测试几次,但效果稳定:17MB /秒/dev/diskVS 20MB /秒/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/diskVS 87MB / S/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)
    

2

我知道这是一个古老的话题,但是其他人可能会对我尝试过的速度带来的影响感兴趣。我想将MacBook Pro 13英寸Retina(带有Silicon Power 1 TB SSD)中的内部SSD备份到外部USB 3.0 2.5英寸硬盘驱动器上,以同时捕获macOS和BOOTCAMP分区。我的初始命令行是:

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

结果是〜31.3 MB /秒的复制速率。这太久了,让我久等了。因此,在第二次尝试中,命令行为:

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

使用/dev/rdisk而不是/dev/disk显着加快速度,达到约98.4 MB /秒!但是,它变得更好。因此,对于第三次尝试,我使用了以下命令行:

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

稀疏选项告诉DD不要麻烦写输入上全为0的输出块。很棒的是,即使在磁盘“满”区域的中间,它也比您想象的要快得多。在任何未满的驱动器上,您将拥有巨大的0块,从而进一步加快了DD的速度。到目前为止,至少到目前为止,DD仅以我的硬盘的理论传输速度运行:〜116.4 MB /秒,但尚未达到那些大的空白区域。

试试看这些选项-它们起作用!请注意:请仔细更改if=并  of=正确指向列出的正确驱动器(对于Macs):

diskutil list

1
conv=sparse复制文件时很棒   我很担心,复印时可能会带来腐败整个磁盘, 分区或者一个  文件系统除非你知道100%的把握目标磁盘只含有零。
G-Man

1

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


2
在2013年末运行MacOS 10.13.2的Macbook Pro上,虽然将内部SSD存储中的4.6GB raspbian-stretch映像写入具有dd和1MB bs的SD卡的/ dev / rdisk仍然比/ dev / disk快得多。使用/ dev / disk花了27.16分钟,使用/ dev / rdisk花了仅5.18分钟。
digitaladdictions

@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大小/缓存/可用空间/操作系统硬盘接口,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)

您可以看到,写入速度>读取速度!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.