Warum ist "/ dev / rdisk" unter Mac OS X etwa 20-mal schneller als "/ dev / disk"?

129

Gemäß der rasbery pi-Dokumentation können Sie Ihr Betriebssystem entweder mit / dev / disk oder / dev / rdisk auf eine Flash-Karte laden.

rdisk steht für raw disk.

/ dev / disk ist ein Block-Level-Gerät. Warum ist rdisk 20-mal schneller?

Verwenden von Mac OSX

Hinweis: In OS X kann jede Festplatte zwei Pfadverweise in / dev haben: / dev / disk # ist ein gepuffertes Gerät, was bedeutet, dass alle gesendeten Daten einer zusätzlichen Verarbeitung unterzogen werden. / dev / rdisk # ist ein unformatierter Pfad, der viel schneller ist und bei Verwendung des Programms dd vollkommen in Ordnung ist. Auf einer SD-Karte der Klasse 4 war der Unterschied unter Verwendung des Festplattenpfads etwa 20-mal schneller.

Spuder
quelle
3
Als Randnotiz habe ich einen Test durchgeführt und die Festplatte hat tatsächlich viel länger gedauert.
Spuder
4
Als weitere Randnotiz hatte ich das Gefühl, dass ich auch testen musste, und stellte fest, dass eine rdisk-Kopie (über dd) fast genau viermal schneller war als die Verwendung des Festplatten-Gegenstücks.
Travis Griggs
Mac OSX 10.9.1 (MacBook Pro 15 Zoll, Anfang 2011)
Travis Griggs
2
Ich dachte, "rdisk" sei ein Tippfehler in einer Anleitung für ein Raspberry Pi SD-Karten-Image, das ich gerade las. Bei weiteren Nachforschungen habe ich den Unterschied gegoogelt und diesen Thread gefunden. In meinem Fall war es 13-mal schneller, ein 1,7-GB-Image mit / dev / rdisk anstelle von / dev / disk auf eine SD-Karte zu schreiben! Macbook Pro Retina 13 ", Modell für Anfang 2015.
tobias.mcnulty
2
Als weitere Randnotiz habe ich gerade ein Ubuntu-ARM-Image auf meine neu gekaufte Sandisk Extreme Pro MicroSD-Karte geschrieben. / dev / disk1 schrieb mit 2,3 MB / s, während / dev / rdisk1 mit 83,7 MB / s schrieb, was 36,4-mal so schnell ist.
DanielSmedegaardBuus

Antworten:

93

Von man hdiutil:

/ dev / rdisk-Knoten sind zeichenorientierte Geräte, sind jedoch im BSD-Sinne "raw" und erzwingen blockorientierte E / A. Sie befinden sich näher an der physischen Festplatte als am Puffercache. / dev / disk-Knoten hingegen sind gepufferte blockspezifische Geräte und werden hauptsächlich vom Dateisystemcode des Kernels verwendet.

In Laienbegriffen /dev/rdiskgeht das fast direkt auf Platte und /dev/diskgeht über einen längeren, teureren Weg

Daniël W. Crompton
quelle
14
Warum Festplatte verwenden, wenn Sie Rdisk verwenden können?
user391339
20
@ user391339 Da Caching immer noch eine wünschenswerte Sache ist. In Fällen, in denen Sie über Wechselmedien verfügen, möchten Sie die Daten so schnell wie möglich auf dem physischen Gerät abrufen, da Sie die Daten an einem anderen physischen Ort speichern möchten. Interne Festplatten sind eine andere Geschichte. Normalerweise tragen Sie sie nicht mit sich herum, sodass es Ihnen egal ist, wann die Daten tatsächlich auf das Gerät geschrieben werden. Wenn Sie Daten zwischenspeichern, die auf Geräte geschrieben oder von diesen gelesen wurden, ist dies eine teurere Methode zum Schreiben auf die Festplatte, aber Ihre Programme sind immer noch schneller, da sie nicht warten müssen, bis alle Daten, die sie schreiben möchten, auf die Festplatte geschrieben wurden.
Kritzefitz,
@ Dan, Re "Kraft"; Bedeutung?
Pacerier
Ich bin mir nicht sicher, ob Krit's Erklärung für mich funktioniert. Mein Fall mag etwas speziell sein, wenn ich eine große externe Festplatte schneller einmal scannen möchte, und ich bin mir nicht sicher, welche Methode dafür besser geeignet ist, aber ansonsten kann ich den normalen Gebrauch noch gut gebrauchen und darauf warten, dass sie wie üblich ausgeworfen wird trainieren. Unter Windows habe ich jedoch immer das "Quick Unplug" -Profil bevorzugt, das meines Erachtens den "Raw" -Modus des Mac widerspiegelt, da es weniger Dateisystembeschädigungen bei unerwarteten Verbindungsverlustereignissen ankündigt.
Pysis
96

Die akzeptierte Antwort ist richtig, geht aber nicht ins Detail.

Einer der Hauptunterschiede zwischen /dev/diskund /dev/rdisk, wenn Sie vom Benutzerbereich aus darauf zugreifen, ist die /dev/diskPufferung. Der Lese- / Schreibpfad für /dev/diskteilt die E / A in 4-KB-Blöcke auf, die in den Puffercache eingelesen und dann in den Benutzerbereichspuffer kopiert werden (und dann den nächsten 4-KB-Lesevorgang ausgeben ...). Das ist insofern schön, als Sie unausgerichtete Lese- und Schreibvorgänge ausführen können, und es funktioniert einfach. Im Gegensatz dazu wird /dev/rdiskdas Lesen oder Schreiben im Grunde nur direkt an das Gerät weitergeleitet, was bedeutet, dass Anfang und Ende der E / A an Sektorgrenzen ausgerichtet werden müssen.

Wenn Sie mehr als einen Sektor lesen oder schreiben /dev/rdisk, wird diese Anforderung direkt weitergeleitet. Die unteren Schichten können es aufteilen (z. B. USB zerlegt es aufgrund der maximalen Nutzlastgröße im USB-Protokoll in 128 KB-Teile), aber Sie können im Allgemeinen größere und effizientere E / A erhalten. dd128 KB bis 1 MB sind beim Streamen, wie beispielsweise über , recht gute Größen, um auf aktueller Nicht-RAID-Hardware eine nahezu optimale Leistung zu erzielen.

Das Zwischenspeichern über /dev/diskdie Lese- und Schreibpfade ist sehr einfach und fast hirntot. Es wird zwischengespeichert, auch wenn dies nicht unbedingt erforderlich ist. Als ob das Gerät Speicher zuordnen und direkt in den Puffer Ihrer App übertragen könnte. Es führt kleine (4 KB) E / As aus, was zu einem hohen E / A-Overhead führt. Es wird weder vorgelesen noch hinterher geschrieben.

anweisen
quelle
6

Es scheint /dev/diskund /dev/rdiskfunktioniert anders für Festplatten und SSDs. Willst du es für MicroSD-Karte überprüft. Habe gerade ein 2 GB-Image auf Sandisk Ultra MicroSD 64 GB geschrieben ( https://www.amazon.com/gp/product/B073JYVKNX ).

Wiederholte Tests mehrmals, aber die Ergebnisse waren stabil: 17 MB / s für /dev/diskvs 20 MB / s für /dev/rdisk. Der Wechsel bs=1mzu bs=16mgibt absolut keinen Unterschied in der Schreibgeschwindigkeit.

  1. Schreiben an /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. Schreiben an /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)
    

Dann habe ich beschlossen, die Lesegeschwindigkeit zu testen: 26 MB / s für /dev/diskvs 87 MB / s für /dev/rdisk. Der Wechsel bs=1mzu bs=16mgibt absolut keinen Unterschied in der Lesegeschwindigkeit.

  1. Lesen aus /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. Lesen aus /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)
    
k06a
quelle
2

Ich weiß, dass dies ein alter Thread ist, aber andere Leute interessieren sich vielleicht für die Auswirkungen der Geschwindigkeit, die ich ausprobiert habe. Ich möchte meine interne SSD in meinem MacBook Pro 13 "Retina (mit einer Silicon Power 1 TB SSD) auf einer externen USB 3.0 2.5" -Festplatte sichern und sowohl die macOS- als auch die BOOTCAMP-Partition aufzeichnen. Meine anfängliche Befehlszeile war:

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

Das Ergebnis war eine Kopierrate von ~ 31,3 MB / Sekunde. Das war einfach zu lang, um mich warten zu lassen. Beim zweiten Versuch lautete die Befehlszeile also:

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

Mit /dev/rdiskstatt /dev/diskdeutlich beschleunigten Dingen auf ca. 98,4 MB / Sekunde! Es wird jedoch noch besser. Für den dritten Versuch habe ich die folgende Befehlszeile verwendet:

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

Die Option sparse weist DD an, sich nicht darum zu kümmern, in Ausgabeblöcke zu schreiben, die alle 0en am Eingang haben. Was cool ist, ist, dass dies viel schneller als man denkt, auch wenn es mitten in "vollen" Bereichen der Festplatte ist. Auf jedem Laufwerk, das nicht voll ist, haben Sie riesige Brocken von Nullen, was die DD weiter beschleunigt. Zumindest läuft DD bislang nur mit der theoretischen Übertragungsgeschwindigkeit meiner Festplatte: ~ 116,4 MB / Sekunde, und diese großen leeren Bereiche sind noch nicht erreicht.

Probieren Sie diese Optionen aus - sie funktionieren! Bitte beachten Sie: SORGFÄLTIG ändern if=und  of=auf die richtigen Laufwerke verweisen, die von (für Macs) aufgelistet werden:

diskutil list
Mark J Foster
quelle
1
conv=sparseist großartig, wenn Sie Dateien kopieren .    Ich befürchte, dass es beim Kopieren einer gesamten Festplatte, einer Partition oder eines  Dateisystems zu Beschädigungen kommen könnte , es sei denn, Sie wissen mit hundertprozentiger Sicherheit, dass die Zieldisk nur Nullen enthält.
G-Man
1

Zumindest in MacOS High Sierra scheint / dev / disk viel schneller zu sein als / dev / rdisk. Als ich entweder dd oder ddrescue ausführte, betrug mein Durchsatzvergleich beim Kopieren von einer magnetischen Festplatte auf eine SSD 3,7 MBit / s unter Verwendung von / dev / rdisk und 45 MBit / s unter Verwendung von / dev / disk. Daher ist es in späteren Versionen von macOS möglicherweise am besten, / dev / disk anstelle von / dev / rdisk zu verwenden, um die bestmögliche Leistung zu erzielen.

JLG
quelle
2
Beim Schreiben eines 4,6-GB-Raspbian-Stretch-Image vom internen SSD-Speicher auf eine SD-Karte mit einer Speicherkapazität von 1 MB / dev / rdisk ist die Leistung auf einem MacBook Pro mit MacOS 10.13.2 Ende 2013 noch viel höher als bei / dev / disk. Es dauerte 27,16 Minuten mit / dev / disk und nur 5,18 Minuten mit / dev / rdisk.
Digitaladdictions
@digitaladdictions machte nur ein paar Tests auf neuesten macOS: superuser.com/a/1346063/126537
k06a
0

Ich überlege mir vorher, welcher Pfadknoten schneller ist oder tauche in serielle Tests ein. Wir sollten einen anderen Faktor berücksichtigen, der die endgültige Lese- / Schreibgeschwindigkeit dramatisch beeinflusst.

Wie Micro SD-Karten-Spezifikation, Klasse 4/10 / HC I ... SD-Kartenleser-Chip und -Schnittstelle, USB 1.1 / 2.0 / 3.0 / 3.1 OS Gesamtspeicher / Freier Speicher, OS Load, OS Festplattentyp, HDD / SSD, HDD Spin-Geschwindigkeit und Cache-Größe, SSD-Größe / Cache / freier Speicherplatz / OS-Festplatten-Schnittstelle, ata / sata / esata,

Wenn ein Faktor zu einem Engpass wurde, werden wir eine falsche Schlussfolgerung ziehen.

hier ist mein ergebnis: osx 10.12.6, ssd,

Lese microSD 16G von einer USB 2.0-Karte Lese- und Schreibzugriff auf eine externe 3,5-Zoll-Festplatte über USB 3.0,

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

Schreibe microSD 32G durch interne Karte lesen und Datenquelle ist externe 3,5-Zoll-Festplatte von USB 3.0,

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

Sie können sehen, Geschwindigkeit schreiben> Geschwindigkeit lesen!

Digitales Leben
quelle