web-dev-qa-db-fra.com

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

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 toutes les données envoyées font l'objet d'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.

123
spuder

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 le cache de mémoire tampon. Les nœuds/dev/disk, en revanche, 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/rdisk passe presque directement sur le disque et /dev/disk passe par une route plus longue et plus chère

90
Daniël W. Crompton

La réponse acceptée est juste, mais il ne va pas dans les détails.

L'une des principales différences entre /dev/disk et /dev/rdisk, lorsque vous les accès de l'espace utilisateur, est que /dev/disk est tamponnés. La lecture/chemin d'écriture pour /dev/disk casse les E/S en morceaux de 4 Ko, qu'il lit dans le cache de mémoire tampon, puis copie dans la mémoire tampon de l'espace utilisateur (et délivre alors la prochaine lecture 4Ko ...). 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/rdisk essentiellement passe juste la lecture ou d'écriture directement sur l'appareil, ce qui signifie le début et la fin de les E/S doivent être alignés sur les limites du secteur.

Si vous faites une lecture ou d'écriture plus d'un secteur à /dev/rdisk, cette demande sera transmise directement à travers. Les couches inférieures peuvent le casser (par exemple., USB, il se brise en morceaux 128Ko en raison de la taille de la charge utile maximale dans le protocole USB), mais vous pouvez généralement obtenir E/S de plus en plus efficace. Lors de la diffusion, comme par dd, 128Ko à 1Mo sont assez bonnes tailles pour obtenir des performances quasi-optimale sur le matériel actuel non-RAID.

La mise en cache effectué par /dev/disk » s lecture et d'écriture des chemins est très simple et presque mort cérébrale. Il cache même si pas strictement nécessaire; comme si l'appareil pourrait carte mémoire et transférer directement dans la mémoire tampon de votre application. Il fait petit (4 Ko) E/S, ce qui conduit à beaucoup de par-dessus I/O. Il ne fait aucune lecture en avant ou écrit en arrière.

95
astruct

Il semble que /dev/disk et /dev/rdisk fonctionnent différemment pour les disques durs et les disques 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 ).

Tests répétés plusieurs fois, mais les résultats sont stables: 17 Mo/s pour /dev/disk vs 20 Mo/s pour /dev/rdisk. Changer bs=1m en bs=16m ne donne absolument 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/disk vs 87 Mo/s pour /dev/rdisk. Changer bs=1m en bs=16m ne donne absolument 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)
    
5
k06a

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. Par conséquent, sur les versions ultérieures de macOS, il peut être préférable d’utiliser/dev/disk au lieu de/dev/rdisk pour optimiser les performances.

1
JLG