it-swarm.com.de

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

Laut 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 sollte rdisk 20-mal schneller sein?

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 unterliegen./dev/rdisk # ist ein unformatierter Pfad, der viel schneller und in Ordnung ist, wenn Sie das Programm dd verwenden. Auf einer SD-Karte der Klasse 4 war der Unterschied unter Verwendung des Festplattenpfads etwa 20-mal schneller.

123
spuder

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 geht /dev/rdisk fast direkt auf die Festplatte und /dev/disk geht über einen längeren, teureren Weg

90

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

Einer der Hauptunterschiede zwischen /dev/disk und /dev/rdisk besteht darin, dass /dev/disk gepuffert ist, wenn Sie vom Benutzerbereich aus darauf zugreifen. Der Lese-/Schreibpfad für /dev/disk zerlegt die E/A in 4-KB-Blöcke, die in den Puffercache eingelesen und anschließend in den Benutzerbereichspuffer kopiert werden (und gibt dann den nächsten 4-KB-Lesevorgang aus…). Das ist insofern schön, als Sie unausgerichtete Lese- und Schreibvorgänge ausführen können, und es funktioniert einfach. Im Gegensatz dazu leitet /dev/rdisk das Lesen oder Schreiben einfach direkt an das Gerät weiter, was bedeutet, dass Anfang und Ende der E/A an Sektorgrenzen ausgerichtet werden müssen.

Wenn Sie mehr als einen Sektor in /dev/rdisk lesen oder schreiben, 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. Beim Streaming wie bei dd sind 128 KB bis 1 MB recht gute Größen, um auf aktueller Nicht-RAID-Hardware eine nahezu optimale Leistung zu erzielen.

Das Zwischenspeichern über die Lese- und Schreibpfade von /dev/disk 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.

95
astruct

Es scheint, dass /dev/disk und /dev/rdisk für Festplatten und SSDs unterschiedlich funktionieren. 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/disk vs 20 MB/s für /dev/rdisk. Das Ändern von bs=1m in bs=16m ergibt 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 mich entschlossen, die Lesegeschwindigkeit zu testen: 26MB/s für /dev/disk vs. 87MB/s für /dev/rdisk. Das Ändern von bs=1m in bs=16m ergibt absolut keinen Unterschied in der Lesegeschwindigkeit.

  1. Aus /dev/disk2 lesen

    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. Aus /dev/rdisk2 lesen

    $ 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)
    
5
k06a

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 beste Leistung zu erzielen.

1
JLG