¿Por qué "/ dev / rdisk" es aproximadamente 20 veces más rápido que "/ dev / disk" en Mac OS X

129

De acuerdo con la documentación de rasbery pi , puede cargar su sistema operativo en una tarjeta flash con / dev / disk o / dev / rdisk.

rdisk significa disco en bruto.

/ dev / disk es un dispositivo de nivel de bloque, ¿por qué rdisk sería 20 veces más rápido?

Usando Mac OSX

Nota: en OS X, cada disco puede tener dos referencias de ruta en / dev: / dev / disk # es un dispositivo almacenado en búfer, lo que significa que cualquier información que se envíe se procesa de manera adicional. / dev / rdisk # es una ruta sin procesar, que es mucho más rápida y perfectamente correcta cuando se utiliza el programa dd. En una tarjeta SD de Clase 4, la diferencia era alrededor de 20 veces más rápida usando la ruta de disco.

Spuder
fuente
3
Como nota al margen, realicé una prueba y el disco duro realmente tardó mucho más.
Spuder
44
Como otra nota al margen, sentí que también tenía que probar, y descubrí que una copia de disco (a través de dd) era casi exactamente 4 veces más rápido que usar la contraparte del disco.
Travis Griggs
Mac OSX 10.9.1 (MacBook Pro de 15 pulgadas, principios de 2011)
Travis Griggs
2
Pensé que "rdisk" era un error tipográfico en algunas instrucciones para una imagen de tarjeta SD Raspberry Pi que estaba leyendo. Tras una investigación más exhaustiva, busqué en Google la diferencia y encontré este hilo. ¡Resulta que en mi caso fue 13 veces más rápido escribir una imagen de 1.7GB en una tarjeta SD usando / dev / rdisk en lugar de / dev / disk! Macbook Pro Retina 13 ", modelo de principios de 2015.
tobias.mcnulty
2
Como otra nota al margen, acabo de agregar una imagen ARM de Ubuntu a mi tarjeta Sandisk Extreme Pro MicroSD recién comprada. / dev / disk1 escribió a 2.3 MB / s, mientras que / dev / rdisk1 escribió a 83.7 MB / s, o 36.4 veces más rápido.
DanielSmedegaardBuus

Respuestas:

93

De man hdiutil:

Los nodos / dev / rdisk son dispositivos con caracteres especiales, pero son "en bruto" en el sentido BSD y fuerzan la E / S alineada en bloque. Están más cerca del disco físico que el caché del búfer. Los nodos / dev / disk, por otro lado, son dispositivos especiales de bloque almacenados temporalmente y se usan principalmente por el código del sistema de archivos del núcleo.

En términos simples, /dev/rdiskva casi directamente al disco y /dev/diskpasa por una ruta más larga y costosa

Daniël W. Crompton
fuente
14
¿Por qué usar el disco cuando puedes usar rdisk?
user391339
20
@ user391339 Porque el almacenamiento en caché sigue siendo algo deseable. En los casos en que tenga medios extraíbles, desea obtener los datos en el dispositivo físico lo más rápido posible, porque desea los datos en otra ubicación física. Los discos duros internos son una historia diferente. Por lo general, no los lleva consigo, por lo que no le importa cuándo se escriben los datos en el dispositivo. Cuando almacena en caché datos escritos / leídos desde dispositivos, esa es una forma más costosa de escribir en el disco, pero sus programas aún son más rápidos, ya que no necesitan esperar hasta que todos los datos que desean escribir se escriban en el disco.
Kritzefitz
@Dan, Re "fuerza"; ¿sentido?
Pacerier
No estoy seguro de que la explicación de Krit funcione para mí. Mi caso puede ser un poco especial si quiero hacer un escaneo de disco externo grande más rápido una vez, y no estoy seguro de qué método funciona mejor para eso, pero de lo contrario todavía estoy bien con el uso normal y esperando que se expulse como es común práctica. Sin embargo, en Windows siempre he preferido el perfil de "desconexión rápida", que creo que refleja el modo más "en bruto" de Mac porque anuncia menos corrupción del sistema de archivos en eventos inesperados de pérdida de conexión.
Pysis
96

La respuesta aceptada es correcta, pero no entra en muchos detalles.

Una de las diferencias clave entre /dev/disky /dev/rdisk, cuando accede a ellos desde el espacio del usuario, es que /dev/diskestá almacenado en el búfer. La ruta de lectura / escritura /dev/diskdivide la E / S en fragmentos de 4KB, que se lee en la memoria caché del búfer, y luego se copia en el búfer de espacio del usuario (y luego emite la próxima lectura de 4KB ...). Esto es bueno porque puedes hacer lecturas y escrituras sin alinear, y simplemente funciona. En contraste, /dev/rdiskbásicamente solo pasa la lectura o escritura directamente al dispositivo, lo que significa que el inicio y el final de la E / S deben alinearse en los límites del sector.

Si lees o escribes en más de un sector /dev/rdisk, esa solicitud se pasará directamente. Las capas inferiores pueden dividirlo (p. Ej., USB lo divide en partes de 128 KB debido al tamaño máximo de carga útil en el protocolo USB), pero generalmente puede obtener E / S más grandes y más eficientes. Al transmitir, como a través de dd, 128 KB a 1 MB son tamaños bastante buenos para obtener un rendimiento casi óptimo en el hardware actual sin RAID.

El almacenamiento en caché realizado por /dev/disklas rutas de lectura y escritura es muy simple y casi cerebral. Se almacena en caché aunque no sea estrictamente necesario; como si el dispositivo pudiera asignar un mapa de memoria y transferirlo directamente al búfer de su aplicación. Hace E / S pequeñas (4KB), lo que genera una gran sobrecarga por E / S. No lee ni escribe con antelación.

astruct
fuente
6

Parece /dev/disky /dev/rdiskfunciona diferente para HDD y SSD. ¿Quieres comprobarlo para la tarjeta MicroSD? Acabo de escribir una imagen de disco de 2GB en Sandisk Ultra MicroSD 64GB ( https://www.amazon.com/gp/product/B073JYVKNX ).

Repetimos pruebas varias veces, pero los resultados fueron estables: 17 MB / s para /dev/diskvs 20 MB / s para /dev/rdisk. Cambiar bs=1ma no bs=16mda absolutamente ninguna diferencia en la velocidad de escritura.

  1. Escribiendo a /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. Escribiendo a /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)
    

Entonces decidí probar la velocidad de lectura: 26MB / s para /dev/diskvs 87MB / s para /dev/rdisk. Cambiar bs=1ma no bs=16mda absolutamente ninguna diferencia en la velocidad de lectura.

  1. Leyendo 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. Leyendo 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
fuente
2

Sé que este es un hilo viejo, pero otras personas podrían estar interesadas en las implicaciones de velocidad de lo que he intentado. Quiero hacer una copia de seguridad de mi SSD interna en mi MacBook Pro 13 "Retina (con una SSD Silicon Power 1 TB) en una unidad de disco duro USB 3.0 2.5" externa, con el deseo de capturar las particiones macOS y BOOTCAMP. Mi línea de comando inicial fue:

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

Los resultados fueron una tasa de copia de ~ 31.3 MB / segundo. Esto fue demasiado tiempo para hacerme esperar. Entonces, en el segundo intento, la línea de comando fue:

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

¡Usar en /dev/rdisklugar de /dev/diskacelerar significativamente las cosas, a aproximadamente 98.4 MB / segundo! Sin embargo, se pone aún mejor. Entonces, para el tercer intento, utilicé esta línea de comando:

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

La opción dispersa le dice a DD que no se moleste en escribir en los bloques de salida que son todos ceros en la entrada. Lo bueno es que esto se vuelve mucho más rápido de lo que piensas, incluso en el medio de las áreas "llenas" del disco. En cualquier unidad que no esté llena, tendrá enormes fragmentos de 0, acelerando aún más el DD. Hasta ahora, al menos, DD se trata de correr a la velocidad de transferencia teórica de mi disco duro: ~ 116.4 MB / segundo, y aún no ha alcanzado esas grandes áreas en blanco.

Prueba estas opciones: ¡funcionan! Tenga en cuenta: cambie CUIDADOSAMENTE if=of=señale correctamente las unidades correctas enumeradas por (para Mac):

diskutil list
Mark J Foster
fuente
1
conv=sparsees genial cuando estás copiando archivos.    Me preocuparía que pueda introducir corrupción al copiar un disco completo, una partición o un  sistema de archivos , a menos que sepa con 100% de certeza que el disco de destino no contiene más que ceros.
G-Man
1

Para el registro, al menos en macOS High Sierra, / dev / disk parece ser mucho más rápido que / dev / rdisk. Ejecutando dd o ddrescue, mi copia de comparación de rendimiento de un HD magnético a un SSD fue de 3.7MBps usando / dev / rdisk, y 45MBps usando / dev / disk. Por lo tanto, en versiones posteriores de macOS, puede ser mejor usar / dev / disk en lugar de / dev / rdisk para obtener el mejor rendimiento.

JLG
fuente
2
Al escribir una imagen raspbian-stretch de 4.6GB desde el almacenamiento SSD interno en una tarjeta SD con dd y un bs de 1MB / dev / rdisk, aún funciona mucho más rápido que / dev / disk en un macbook pro de finales de 2013 con macOS 10.13.2. Tomó 27.16 minutos usando / dev / disk y solo 5.18 minutos usando / dev / rdisk.
digitaladdictions
@digitaladdictions acaba de hacer algunas pruebas sobre las últimas macOS: superuser.com/a/1346063/126537
k06a
0

Pienso antes de discutir qué nodo de ruta es más rápido o sumergirme en una serie de pruebas. Deberíamos considerar otro factor que afectará dramáticamente la velocidad final de lectura / escritura.

como las especificaciones de la tarjeta Micro SD, clase 4/10 / HC I ... chip lector de tarjeta SD e interfaz, usb 1.1 / 2.0 / 3.0 / 3.1 os memoria total / memoria libre, carga os, tipo de disco duro os, HDD / SSD, HDD velocidad de centrifugado y tamaño de caché, tamaño SSD / caché / espacio libre / interfaz de disco duro del sistema operativo, ata / sata / esata,

Si algún factor se convirtió en un cuello de botella, tendremos una conclusión falsa.

Aquí está mi resultado: OSX 10.12.6, SSD,

lea microSD 16G con una tarjeta usb 2.0 lea y escriba en un disco duro externo de 3.5 pulgadas con usb 3.0,

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

escriba microSD 32G a través de la tarjeta interna de lectura y la fuente de datos es un disco duro externo de 3.5 pulgadas con usb 3.0

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

puedes ver, velocidad de escritura> velocidad de lectura !!

Vida digital
fuente