Por que "/ dev / rdisk" é cerca de 20 vezes mais rápido que "/ dev / disk" no Mac OS X

129

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

rdisk significa disco bruto.

/ dev / disk é um dispositivo em nível de bloco, por que o rdisk seria 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 qualquer dado enviado é submetido a um processamento extra. / dev / rdisk # é um caminho simples, muito mais rápido e perfeitamente adequado ao usar o programa dd. Em um cartão SD de classe 4, a diferença era cerca de 20 vezes mais rápida usando o caminho do rdisk.

spuder
fonte
3
Como uma observação lateral, fiz um teste e o rdisk realmente levou muito mais tempo.
Spuder
4
Como outra nota lateral, achei que também precisava testar e descobri que uma cópia do rdisk (via dd) era quase exatamente quatro vezes mais rápida do que usar a contraparte do disco.
Travis Griggs
Mac OSX 10.9.1 (MacBook Pro de 15 polegadas, início de 2011)
Travis Griggs
2
Eu pensei que "rdisk" era um erro de digitação em algumas instruções para uma imagem de cartão SD do Raspberry Pi que estava lendo. Após uma investigação mais aprofundada, pesquisei a diferença e encontrei este tópico. No meu caso, foi 13 vezes mais rápido gravar uma imagem de 1,7 GB em um cartão SD usando / dev / rdisk em vez de / dev / disk! Macbook Pro Retina 13 ", modelo do início de 2015.
tobias.mcnulty 01/08/2015
2
Como mais uma nota de rodapé, acabei de adicionar uma imagem do Ubuntu ARM ao meu cartão Sandisk Extreme Pro MicroSD recém-adquirido. O / dev / disk1 gravou a 2,3 MB / s, enquanto o / dev / rdisk1 gravou a 83,7 MB / s, ou 36,4 vezes mais rápido.
DanielSmedegaardBuus

Respostas:

93

De man hdiutil:

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

Em termos leigos, /dev/rdiskvai quase diretamente para o disco e /dev/diskpassa por uma rota mais longa e mais cara

Daniël W. Crompton
fonte
14
por que usar disco quando você pode usar o rdisk?
user391339
20
@ user391339 Porque a cache ainda é uma coisa desejável. Nos casos em que você possui mídia removível, deseja obter os dados no dispositivo físico o mais rápido possível, porque deseja que os dados sejam em outro local físico. Os discos rígidos internos são uma história diferente. Você geralmente não os carrega, portanto, não se importa quando os dados são realmente gravados no dispositivo. Quando você armazena em cache os dados gravados para / lidos a partir de dispositivos, é uma maneira 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 "force"; significado?
Pacerier 03/03
Não tenho certeza se a explicação de Krit funciona para mim. Meu caso pode ser um pouco especial, desejando fazer uma varredura única rápida de disco externo grande, e não tenho certeza de qual método funciona melhor para isso, mas, caso contrário, ainda estou bem com o uso normal e aguardando a ejeção, como é comum prática. No Windows, no entanto, sempre preferi o perfil de 'desconexão rápida', que acho que reflete o modo mais 'bruto' do Mac, porque anuncia menos corrupção do sistema de arquivos em eventos inesperados de perda de conexão.
Pysis
96

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

Uma das principais diferenças entre /dev/diske /dev/rdisk, quando você as acessa do espaço do usuário, é o /dev/diskbuffer. O caminho de leitura / gravação para /dev/diskdivide os blocos de E / S em pedaços de 4KB, que são lidos no cache do buffer e, em seguida, copiados no buffer do espaço do usuário (e, em seguida, emitidos na próxima leitura de 4KB ...). Isso é bom porque você pode fazer leituras e gravações desalinhadas, e simplesmente funciona. Por outro lado, /dev/rdiskbasicamente apenas passa a leitura ou gravação diretamente para o dispositivo, o que significa que o início e o final da E / S precisam estar alinhados nos limites do setor.

Se você fizer uma leitura ou gravação maior que um setor /dev/rdisk, essa solicitação será passada diretamente. As camadas inferiores podem dividi-lo (por exemplo, o USB divide-o em partes de 128 KB devido ao tamanho máximo de carga útil no protocolo USB), mas geralmente você pode obter E / Ss maiores e mais eficientes. Ao transmitir, como via dd, 128 KB a 1 MB são tamanhos muito bons para obter desempenho quase ideal no hardware não RAID atual.

O armazenamento em cache pelos /dev/diskcaminhos de leitura e gravaçã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 realiza pequenas E / Ss (4KB), o que gera muitas sobrecargas por E / S. Não faz nenhuma leitura à frente ou escreve para trás.

construir
fonte
6

Parece /dev/diske /dev/rdiskfunciona diferente para HDDs e SSDs. Quero verificar se há cartão MicroSD. Acabei de gravar uma imagem de disco de 2 GB no 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/diskvs 20MB / s para /dev/rdisk. Alterar bs=1mpara não bs=16mdá absolutamente nenhuma diferença na velocidade de gravação.

  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 eu decidi testar a velocidade de leitura: 26MB / s para /dev/diskvs 87MB / s para /dev/rdisk. Alterar bs=1mpara não bs=16mdá absolutamente nenhuma diferença na velocidade de leitura.

  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)
    
k06a
fonte
2

Eu sei que esse é um tópico antigo, mas outras pessoas podem estar interessadas nas implicações de velocidade do que eu tentei. Desejo fazer backup do meu SSD interno no meu MacBook Pro 13 "Retina (com um SSD Silicon Power 1 TB) em uma unidade de disco rígido externa USB 3.0 de 2,5", desejando capturar as partições macOS e BOOTCAMP. Minha linha de comando inicial era:

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

Os resultados foram uma taxa de cópia de ~ 31,3 MB / segundo. Isso foi muito longo para me deixar esperando. Portanto, na segunda tentativa, a linha de comando foi:

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

Usando em /dev/rdiskvez de /dev/diskacelerar significativamente as coisas, para cerca de 98,4 MB / segundo! No entanto, fica ainda melhor. Então, para a terceira tentativa, usei esta linha de comando:

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

A opção esparsa diz ao DD para não se preocupar em escrever para os blocos de saída que são todos os 0s na entrada. O legal é que isso fica muito mais rápido do que você imagina, mesmo no meio de áreas "cheias" do disco. Em qualquer unidade que não esteja cheia, você terá grandes quantidades de 0s, acelerando ainda mais o DD. Até agora, pelo menos, o DD está rodando na velocidade de transferência teórica do meu disco rígido: ~ 116,4 MB / segundo, e ainda não atingiu essas grandes áreas em branco.

Experimente essas opções - elas funcionam! Observe: Altere com cuidado if=of=aponte corretamente para as unidades corretas listadas por (para Macs):

diskutil list
Mark J Foster
fonte
1
conv=sparseé ótimo quando você está copiando arquivos.    Eu ficaria preocupado que isso possa causar corrupção ao copiar um disco inteiro, uma partição ou um  sistema de arquivos , a menos que você saiba com 100% de certeza que o disco de destino contém apenas zeros.
G-Man
1

Para constar, pelo menos no macOS High Sierra, / dev / disk parece ser muito mais rápido que / dev / rdisk. Executando dd ou ddrescue, minha comparação de taxa de transferência de cópia de um HD magnético para um SSD foi de 3,7 MBps usando / dev / rdisk e 45 MBps usando / dev / disk. Portanto, nas versões posteriores do macOS, talvez seja melhor usar / dev / disk em vez de / dev / rdisk para obter o melhor desempenho.

JLG
fonte
2
Enquanto grava uma imagem de 4,6GB de extensão raspbian do armazenamento SSD interno em um cartão SD com dd e um bs de 1 MB / dev / rdisk, o desempenho ainda é muito mais rápido que o / dev / disk em um macbook pro de 2013 com 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 macOS mais recente: superuser.com/a/1346063/126537
k06a
0

Acho que antes de discutir qual nó do caminho é mais rápido ou mergulhar em testes seriais. Devemos considerar outro fator que afetará drasticamente a velocidade final de leitura / gravação.

como especificação do cartão Micro SD, classe 4/10 / HC I ... chip e interface de leitor de cartão sd, usb 1.1 / 2.0 / 3.0 / 3.1 os memória total / memória livre, carga do sistema operacional, tipo de disco rígido, disco rígido / disco rígido, disco rígido velocidade de rotação e tamanho do cache, tamanho do SSD / cache / espaço livre / interface do disco rígido do sistema operacional, ata / sata / esata,

se algum fator se tornar um gargalo, teremos uma conclusão falsa.

Aqui está o meu resultado: osx 10.12.6, ssd,

leia o microSD 16G por um cartão USB 2.0, leia e grave em HDD externo de 3,5 polegadas por usb 3.0,

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

escreva microSD 32G através da leitura interna do cartão e a fonte de dados é um HDD externo de 3,5 polegadas por usb 3.0,

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

você pode ver, escrever velocidade> velocidade de leitura !!

Vida Digital
fonte