Pourquoi «/ dev / rdisk» est-il environ 20 fois plus rapide que «/ dev / disk» sous Mac OS X

129

Selon la documentation de rasbery pi , vous pouvez charger votre système d’exploitation sur une carte flash avec / dev / disk ou / dev / rdisk.

rdisk est synonyme de disque brut.

/ dev / disk est un périphérique de niveau bloc, pourquoi rdisk serait-il 20 fois plus rapide?

Utiliser Mac OSX

Remarque: Sous OS X, chaque disque peut avoir deux références de chemin dans / dev: / dev / disk # est un périphérique mis en mémoire tampon, ce qui signifie que toute donnée envoyée subit un traitement supplémentaire. / dev / rdisk # est un chemin brut, beaucoup plus rapide et parfaitement correct lorsque vous utilisez le programme dd. Sur une carte SD de classe 4, la différence était environ 20 fois plus rapide avec le chemin d'accès au disque dur.

spuder
la source
3
En passant, j’ai fait un test et le disque dur a pris beaucoup plus de temps.
spuder
4
Comme autre remarque, j’ai eu le sentiment que je devais aussi tester, et j’ai trouvé qu’une copie de disque (via dd) était presque 4 fois plus rapide que celle utilisée avec l’équivalent disque.
Travis Griggs
Mac OSX 10.9.1 (MacBook Pro 15 pouces, début 2011)
Travis Griggs
2
Je pensais que "rdisk" était une faute de frappe dans certaines instructions pour une image de carte SD Raspberry Pi que je lisais. Après une enquête plus approfondie, j'ai cherché sur Google la différence et trouvé ce fil. Il s'est avéré que dans mon cas, il était 13 fois plus rapide d'écrire une image de 1,7 Go sur une carte SD en utilisant / dev / rdisk au lieu de / dev / disk! Macbook Pro Retina 13 ", modèle de début 2015.
tobias.mcnulty
2
Autre nouveauté: je viens d'ajouter une image Ubuntu ARM à ma carte Sandisk Extreme Pro MicroSD récemment achetée. / dev / disk1 écrit à 2,3 Mo / s, alors que / dev / rdisk1 écrit à 83,7 Mo / s, soit 36,4 fois plus vite.
DanielSmedegaardBuus

Réponses:

93

De man hdiutil:

Les nœuds / dev / rdisk sont des périphériques spéciaux, mais sont "bruts" au sens BSD et forcent les E / S alignées par blocs. Ils sont plus proches du disque physique que du cache tampon. Les nœuds / dev / disk, quant à eux, sont des périphériques spéciaux réservés aux blocs et utilisés principalement par le code du système de fichiers du noyau.

En termes simples, /dev/rdiskpresque directement sur disque et /dev/diskpasse par un itinéraire plus long et plus coûteux

Daniël W. Crompton
la source
14
pourquoi utiliser un disque quand vous pouvez utiliser rdisk?
user391339
20
@ user391339 Parce que la mise en cache est toujours une chose souhaitable. Dans les cas où vous disposez d'un support amovible, vous souhaitez obtenir les données sur le périphérique physique aussi rapidement que possible, car vous souhaitez que les données se trouvent dans un autre emplacement physique. Les disques durs internes sont une autre histoire. En général, vous ne les transportez pas, vous ne vous souciez donc pas du moment où les données sont réellement écrites sur le périphérique. Lorsque vous mettez en cache des données écrites sur / lues à partir de périphériques, cela représente un moyen plus coûteux d'écrire sur le disque, mais vos programmes sont toujours plus rapides, car ils n'ont pas besoin d'attendre que toutes les données qu'ils souhaitent écrire soient écrites sur le disque.
Kritzefitz
@Dan, Re "force"; sens?
Pacerier
Pas sûr que l'explication de Krit fonctionne pour moi. Mon cas est peut-être un peu spécial et je souhaite effectuer une analyse ponctuelle plus rapide des disques externes de grande taille, et je ne suis pas sûr de la méthode la mieux adaptée à cette tâche. Sinon, l'utilisation normale me convient et j'attends qu'elle soit éjectée comme d'habitude. entraine toi. Sous Windows, cependant, j'ai toujours préféré le profil de «débranchement rapide» qui, je suppose, reflète le mode plus «brut» de Mac, car il annonce moins de corruption du système de fichiers lors d'événements de perte de connexion inattendus.
Pysis
96

La réponse acceptée est correcte, mais elle n’entre pas dans les détails.

L'une des principales différences entre /dev/disket /dev/rdisk, lorsque vous y accédez à partir de l'espace utilisateur, /dev/diskest la mise en mémoire tampon. Le chemin de lecture / écriture pour /dev/diskdivise les E / S en blocs de 4 Ko, qu'il lit dans le cache de la mémoire tampon, puis copie dans le tampon de l'espace utilisateur (puis émet la lecture suivante de 4 Ko ...). C'est bien en ce sens que vous pouvez faire des lectures et des écritures non alignées, et que cela fonctionne. En revanche, /dev/rdiskla lecture ou l'écriture est directement transmise au périphérique, ce qui signifie que le début et la fin de l'E / S doivent être alignés sur les limites du secteur.

Si vous faites une lecture ou écrivez plus grand qu'un secteur /dev/rdisk, cette demande sera transmise directement. Les couches inférieures peuvent le casser (par exemple, USB le divise en 128 Ko en raison de la taille maximale de la charge utile dans le protocole USB), mais vous pouvez généralement obtenir des E / S plus grandes et plus efficaces. Lors de la diffusion, comme via dd, 128 Ko à 1 Mo sont de très bonnes tailles pour obtenir des performances quasi optimales sur du matériel non RAID actuel.

La mise en cache effectuée par /dev/diskles chemins de lecture et d'écriture est très simple et presque morte. Il cache même si pas strictement nécessaire; comme si l'appareil pouvait faire une carte mémoire et transférer directement dans le tampon de votre application. Il fait de petites entrées / sorties (4 Ko), ce qui entraîne beaucoup de frais généraux par entrée / sortie. Il ne fait aucune lecture en avant ou écrit en arrière.

astruct
la source
6

Il semble /dev/disket /dev/rdiskfonctionne différemment pour les disques durs et SSD. Vous voulez vérifier pour la carte MicroSD. Je viens d'écrire une image disque de 2 Go sur Sandisk Ultra MicroSD 64 Go ( https://www.amazon.com/gp/product/B073JYVKNX ).

Des tests répétés à plusieurs reprises, mais les résultats sont stables: 17Mo / s pour /dev/diskvs 20 Mo / s pour /dev/rdisk. Passer bs=1mà ne bs=16mdonne aucune différence de vitesse d’écriture.

  1. Ecrire à /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. Ecrire à /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)
    

Ensuite, j'ai décidé de tester la vitesse de lecture: 26 Mo / s pour /dev/diskvs 87 Mo / s pour /dev/rdisk. Passer bs=1mà ne bs=16mdonne aucune différence de vitesse de lecture.

  1. Lecture de /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. Lecture de /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
la source
2

Je sais que c'est un vieux fil, mais d'autres personnes pourraient être intéressées par les implications en termes de vitesse de ce que j'ai essayé. Je souhaite sauvegarder mon disque SSD interne dans mon MacBook Pro 13 "Retina (avec un disque SSD Silicon Power 1 To) sur un disque dur externe USB 3.0 2,5", dans le but de capturer les partitions macOS et BOOTCAMP. Ma ligne de commande initiale était:

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

Les résultats étaient un taux de copie d'environ 31,3 Mo / seconde. C'était trop long pour me faire attendre. Ainsi, à la deuxième tentative, la ligne de commande était la suivante:

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

Utiliser /dev/rdiskau lieu d' /dev/diskaccélérer considérablement, jusqu'à environ 98,4 Mo / seconde! Cependant, ça va encore mieux. Donc, pour la troisième tentative, j'ai utilisé cette ligne de commande:

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

L'option sparse indique à DD de ne pas se soucier d'écrire dans des blocs de sortie qui sont tous des 0 sur l'entrée. Ce qui est bien, c’est que cela devient beaucoup plus rapide que vous ne le pensez, même au milieu de zones "pleines" du disque. Sur tout lecteur qui n'est pas plein, vous aurez d'énormes morceaux de 0, ce qui accélérera encore la DD. Jusqu'à présent, au moins, DD ne fait que tourner à la vitesse de transfert théorique de mon disque dur: ~ 116,4 Mo / seconde, et il n'a pas encore atteint ces grandes zones vierges.

Essayez ces options - elles fonctionnent! Remarque: Modifiez ATTENTIVEMENT if=et  of=pointez correctement sur les lecteurs appropriés répertoriés par (pour les Mac):

diskutil list
Mark J Foster
la source
1
conv=sparseest formidable lorsque vous copiez des fichiers.    Je crains que cela ne crée une corruption lors de la copie d' un disque entier, d' une partition ou d' un  système de fichiers , à moins que vous ne sachiez avec une certitude à 100% que le disque de destination ne contient que des zéros.
G-Man
1

Pour mémoire, dans macOS High Sierra au moins, / dev / disk semble être beaucoup plus rapide que / dev / rdisk. En utilisant dd ou ddrescue, ma copie de comparaison de débit d’un disque dur magnétique à un disque SSD s’élevait à 3,7 Mbps avec / dev / rdisk et 45 Mbps avec / dev / disk. Ainsi, sur les versions ultérieures de macOS, il peut être préférable d’utiliser / dev / disk au lieu de / dev / rdisk pour de meilleures performances.

JLG
la source
2
Lors de l'écriture d'une image Raspbian Stretch de 4,6 Go à partir du stockage SSD interne sur une carte SD avec dd et un bs de 1 Mo / dev / rdisk, les performances sont encore plus rapides que celles de / dev / disk sur un MacBook Pro fin 2013 utilisant macOS 10.13.2. Cela a pris 27,16 minutes avec / dev / disk et seulement 5,18 minutes avec / dev / rdisk.
digitaladdictions
@digitaladdictions vient de faire quelques tests sur le dernier macOS: superuser.com/a/1346063/126537
k06a
0

Je pense qu'avant de discuter quel nœud de chemin est le plus rapide ou plonger dans des tests en série. Nous devrions envisager un autre facteur qui affectera considérablement la vitesse de lecture / écriture finale.

comme la spéc. de la carte Micro SD, classe 4/10 / HC I ... puce de lecteur de carte SD et interface, usb 1.1 / 2.0 / 3.0 / 3.1 mémoire totale / mémoire disponible, charge, type de disque dur, disque dur / SSD, disque dur vitesse de rotation et taille du cache, taille du SSD / cache / espace libre / interface du disque dur os, ata / sata / esata,

si un facteur devenait un goulot d'étranglement, nous aurions une fausse conclusion.

voici mon résultat: osx 10.12.6, ssd,

lire la carte microSD 16G avec une carte USB 2.0 en lecture et en écriture sur un disque dur externe de 3,5 pouces avec une clé USB 3.0,

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

écrire microSD 32G à travers la lecture de la carte interne et la source de données est un disque dur externe de 3,5 pouces par USB 3.0,

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

vous pouvez voir, vitesse d'écriture> vitesse de lecture !!

La vie numérique
la source