sd カード – なぜ Mac OS X では、”/dev/rdisk” が “/dev/disk” よりも約 20 倍速いのか?

dd dev disk-utility sd-card

rasbery pi documentationによると、/dev/diskか/dev/rdiskのどちらかでフラッシュカードにOSをロードすることができます

rdisk は raw disk の略です

/dev/disk はブロックレベルのデバイスですが、なぜ rdisk の方が 20 倍速いのでしょうか?

Mac OSXを使用して

Note: OS X では、各ディスクは /dev に二つのパス参照を持つことができます。/dev/disk# はバッファリングされたデバイスで、送信されるデータは余分な処理を受けます。/dev/rdisk# は生のパスで、こちらの方がずっと速く、dd プログラムを使っているときは完全に問題ありません。クラス 4 の SD カードでは、rdisk パスを使った方が約 20 倍速くなりました

  140  spuder  2013-08-13


ベストアンサー

man hdiutilから

/dev/rdisk ノードは文字に特化したデバイスですが、BSD の意味では “raw” であり、ブロックアラインメントされた I/O を強制的に行います。バッファキャッシュよりも物理ディスクに近いです。一方、/dev/disk ノードはバッファ付きのブロック特殊デバイスで、主にカーネルのファイルシステムコードによって使われます

平たく言えば、/dev/rdiskはほぼ直接ディスクに、/dev/diskはより長い高価なルートを経由します

98  Daniël W. Crompton  2013-08-13


受け入れられた答えは正しいのですが、あまり詳しくは書かれていません

/dev/disk/dev/rdisk の重要な違いの一つは、ユーザ空間からアクセスする場合、/dev/disk はバッファリングされていることです。/dev/disk の読み書きパスは、I/O を 4KB のチャンクに分割し、バッファキャッシュに読み込み、ユーザ空間バッファにコピーします (そして、次の 4KB の読み込みを発行します…)。これは、アラインメントされていない読み書きができるという点で優れています。対照的に、/dev/rdiskでは、基本的には読み書きを直接デバイスに渡すだけなので、I/Oの開始と終了をセクタ境界で揃える必要があります

/dev/rdiskに対して1セクタよりも大きなリードやライトを行うと、そのリクエストはそのままスルーされてしまいます。下位レイヤはそれを分割するかもしれませんが(例えば、USBはUSBプロトコルの最大ペイロードサイズのために128KBに分割しています)、一般的にはより大きく、より効率的なI/Oを得ることができます。ストリーミングの場合、dd経由のように、現在の非RAIDハードウェアで最適に近い性能を得るには、128KBから1MBがかなり良いサイズです

/dev/diskの読み書きパスによって行われるキャッシングは非常にシンプルで、ほとんど脳死状態です。デバイスがメモリマップして、アプリのバッファに直接転送することができた場合のように、厳密には必要でなくてもキャッシュします。それは小さい(4KB) I/Oを行うため、I/Oあたりのオーバーヘッドが多くなります。それは、任意の読み取りを先に行うことはありませんし、後ろに書き込みを行います

104  astruct  2015-03-23


HDDとSSDでは/dev/disk/dev/rdiskの動作が違うようです。MicroSDカードでも確認してみたい。Sandisk Ultra MicroSD 64GB (https://www.amazon.com/gp/product/B073JYVKNX)に2GBのディスクイメージを書き込んだところ

何度かテストを繰り返したが、結果は安定していた。/dev/diskでは17MB/s、/dev/rdiskでは20MB/s。bs=1mbs=16mに変更しても、書き込み速度に全く違いはありません

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

/dev/diskでは26MB/s、/dev/rdiskでは87MB/sというように、読み込み速度をテストすることにしました。bs=1mbs=16mに変更しても、読み込み速度には全く差がありません

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

6  k06a  2018-08-04


これは古いスレッドであることを知っていますが、他の人は私が試したことの速度の意味合いに興味があるかもしれません。私は、MacBook Pro 13″ Retina(Silicon Power 1 TB SSD搭載)の内蔵SSDを外付けUSB 3.0 2.5″ ハードディスクドライブにバックアップし、macOSとBOOTCAMPパーティションの両方をキャプチャしたいと思っています。私の最初のコマンドラインは

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

結果は、コピーレートが~31.3 MB/秒でした。これでは長すぎて待たされてしまいました。そこで、2回目の試みでは、コマンドラインは

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

/dev/disk の代わりに /dev/rdisk を使用すると、約 98.4 MB/秒にまで大幅に高速化されました。しかし、それはさらに良くなります。そこで、3回目の試みでは、このコマンドラインを使ってみました

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

sparse オプションは、DD に、入力上のすべてが 0 である出力ブロックへの書き込みをわざわざ行わないように指示します。クールなのは、ディスクの「満杯」領域の途中であっても、これが思ったよりもはるかに高速になることです。フルではないドライブでは、0 の巨大な塊が存在し、DD はさらに高速化されます。これまでのところ、少なくとも、私のハードディスクの理論的な転送速度は ~116.4 MB/秒で、DDはまだ大きな空白領域には到達していません

これらのオプションを試してみてください。注意: if=of=を慎重に変更して、(Mac用の)正しいドライブを指すようにしてください

diskutil list

3  Mark J Foster  2019-08-02


ちなみに、少なくともmacOS High Sierraでは、/dev/diskの方が/dev/rdiskよりもずっと速いようです。ddまたはddrescueを実行して、磁気HDからSSDへのコピーのスループットを比較したところ、/dev/rdiskでは3.7MBps、/dev/diskでは45MBpsでした。ですから、それ以降のバージョンのmacOSでは、/dev/rdiskの代わりに/dev/diskを使った方が最高のパフォーマンスを得ることができるかもしれません

1  JLG  2018-01-14


私はどのパスノードが高速であるかを議論する前に、シリアルテストに飛び込むと思います。我々は劇的に最終的な読み書き速度に影響を与える他の要因を考慮する必要があります

マイクロSDカード仕様、クラス4/10/HC I … SDカードリーダーチップとインターフェイス、USB 1.1/2.0/3.0/3.1 OS合計メモリ/フリーメモリ、OS負荷、OSハードディスクタイプ、HDD/SSD、HDD回転速度とキャッシュサイズ、SSDサイズ/キャッシュ/フリースペース/OSハードディスクインターフェイス、OTA/SATA/ESATA、

何らかの要因がボトルネックになると、誤った結論になってしまいます

ここに私の結果があります: osx 10.12.6, ssd,

usb 2.0 カードによる microSD 16G の読み書き usb 3.0 によって外的な 3.5 インチ HDD に読み書きして下さい

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

内部カードによる microSD 32G を書けば読まれたデータ源は usb 3.0 によって外付け 3.5 インチ HDD、です

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

見ての通り、書き込み速度と読み込み速度が違います

0  Digital Life  2019-09-03


タイトルとURLをコピーしました