Questão Por que “/ dev / rdisk” é 20 vezes mais rápido que “/ dev / disk” no Mac OS X


De acordo com documentação rasbery piVocê pode carregar seu sistema operacional em um cartão flash com / dev / disk ou / dev / rdisk.

rdisk significa disco bruto.

/ dev / disk é um dispositivo de nível de bloco por que seria rdisk 20 vezes mais rápido? 

Usando o Mac OSX

Nota: No OS X, cada disco pode ter duas referências de caminho em / dev:   / dev / disk # é um dispositivo em buffer, o que significa que todos os dados enviados   sofre processamento extra. / dev / rdisk # é um caminho bruto, que é muito   mais rápido e perfeitamente OK ao usar o programa dd. Em um SD de classe 4   cartão a diferença foi cerca de 20 vezes mais rápida usando o caminho rdisk.


114


origem


Como uma nota lateral, eu corri um teste e rdisk realmente demorou muito mais tempo. - spuder
Como outra nota, eu senti que tinha que testar também, e descobri que uma cópia do rdisk (via dd) era quase exatamente 4 vezes mais rápida do que usar a contraparte do disco. - Travis Griggs
@TravisGriggs Estou curioso que OS, Mac ou Linux? - spuder
Eu pensei que "rdisk" foi um erro de digitação em algumas instruções para uma imagem de cartão Raspberry Pi SD que eu estava lendo. Após uma investigação mais aprofundada, pesquisei a diferença e encontrei esse segmento. No meu caso, foi 13 vezes mais rápido gravar uma imagem de 1.7GB em um cartão SD usando / dev / rdisk ao invés de / dev / disk! Macbook Pro Retina 13 ", modelo do início de 2015. - tobias.mcnulty
Como mais uma nota, eu adicionei uma imagem do Ubuntu ARM ao meu cartão Sandisk Extreme Pro MicroSD recém-adquirido. / dev / disk1 escreveu em 2.3 MB / s, enquanto / dev / rdisk1 escreveu em 83.7 MB / s, ou 36.4 vezes mais rápido. - DanielSmedegaardBuus


Respostas:


A partir de man hdiutil:

Os nós / dev / rdisk são dispositivos especiais de caractere, mas são "brutos" no sentido BSD e forçam a E / S alinhada a blocos. Eles estão mais próximos do disco físico do que do cache do buffer. Os nós / dev / disk, por outro lado, são dispositivos especiais de bloco em buffer e são usados ​​principalmente pelo código do sistema de arquivos do kernel.

Em termos leigos /dev/rdisk vai quase diretamente para o disco e /dev/disk passa por uma rota mais cara


84



Por que usar o disco quando você pode usar o rdisk? - user391339
@ user391339 Porque o cache ainda é uma coisa desejável. Nos casos em que você tem mídia removível, deseja obter os dados no dispositivo físico o mais rápido possível, porque deseja os dados em outro local físico. Discos rígidos internos são uma história diferente. Você normalmente não os carrega, então você não se importa quando os dados são realmente gravados no dispositivo. Quando você armazena em cache dados gravados em / read de dispositivos que são uma forma mais cara de gravar no disco, mas seus programas ainda são mais rápidos, pois não precisam esperar até que todos os dados que desejam gravar sejam gravados no disco. - Kritzefitz
@ Dan, Re "força"; significado? - Pacerier


A resposta aceita está certa, mas não entra em muitos detalhes.

Uma das principais diferenças entre /dev/disk e /dev/rdisk, quando você os acessa do espaço do usuário, é /dev/disk está em buffer. O caminho de leitura / gravação para /dev/disk divide os blocos de E / S em 4KB, que ele lê no cache de buffer, e copia no buffer de espaço do usuário (e emite a próxima leitura de 4KB…). Isso é legal porque você pode fazer leituras e gravações desalinhadas, e isso simplesmente funciona. Em contraste, /dev/rdisk basicamente apenas passa a leitura ou escreve diretamente para o dispositivo, o que significa que o início e o fim da E / S precisam estar alinhados nos limites do setor.

Se você ler ou escrever mais de um setor para /dev/rdisk, esse pedido será passado diretamente. As camadas inferiores podem dividi-lo (por exemplo, o USB divide em 128 KB devido ao tamanho máximo de carga útil no protocolo USB), mas geralmente você pode obter I / Os maiores e mais eficientes. Quando streaming, como via dd, 128KB a 1MB são tamanhos muito bons para obter um desempenho quase ótimo em hardware não-RAID atual.

O cache sendo feito por /dev/diskOs caminhos de leitura e gravação são muito simples e quase com morte cerebral. Ele armazena em cache, mesmo que não seja estritamente necessário; como se o dispositivo pudesse mapear a memória e transferir diretamente para o buffer do seu aplicativo. Ele faz pequenas E / Ss (4KB), o que leva a muita sobrecarga por E / S. Não faz nenhuma leitura adiante ou escreve atrás.


88





Para o registro, no macOS High Sierra, pelo menos, / dev / disk parece ser muito mais rápido que / dev / rdisk. Executando o dd ou o ddrescue, minha comparação de throughput copiando de um HD magnético para um SSD foi de 3.7MBps usando / dev / rdisk e 45MBps usando / dev / disk. Portanto, em versões posteriores do macOS, talvez seja melhor usar / dev / disk em vez de / dev / rdisk para obter melhor desempenho.


1



Enquanto escreve uma imagem de 4.6GB raspbian-stretch do armazenamento SSD interno para um cartão SD com dd e um bs de 1MB / dev / rdisk ainda executa muito mais rápido que / dev / disk em um macbook pro final de 2013 rodando o macOS 10.13.2. Foram necessários 27,16 minutos usando / dev / disk e apenas 5.18 minutos usando / dev / rdisk. - digitaladdictions
@digitaladdictions acabou de fazer alguns testes no último macOS: superuser.com/a/1346063/126537 - k06a


Parece /dev/disk e /dev/rdisk funciona de forma diferente para HDDs e SSDs. Quero verificá-lo para o cartão MicroSD. Acabei de escrever imagem de disco de 2GB para Sandisk Ultra MicroSD 64GB (https://www.amazon.com/gp/product/B073JYVKNX).

Testes repetidos várias vezes, mas os resultados foram estáveis: 17MB / s para /dev/disk vs 20MB / s para /dev/rdisk. Mudando bs=1m para bs=16m não dá absolutamente nenhuma diferença na velocidade de escrita.

  1. Escrevendo para /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. Escrevendo para /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)
    

Então decidi testar a velocidade de leitura: 26MB / s para /dev/disk vs 87MB / s para /dev/rdisk. Mudando bs=1m para bs=16m não dá absolutamente nenhuma diferença na velocidade de escrita.

  1. Lendo 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. Lendo 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)
    

1