web-dev-qa-db-ja.com

Mac OS Xで“ / dev / rdisk”が“ / dev / disk”の約20倍速いのはなぜですか

rasbery piのドキュメント によると、/ dev/diskまたは/ dev/rdiskを使ってOSをフラッシュカードにロードできます。

rdiskはrawディスクを表します。

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

Mac OSXを使う

注意:OS Xでは、各ディスクの/ devに2つのパス参照があります。/ dev/disk#はバッファデバイスです。つまり、送信されるデータには余分な処理が行われます。/dev/rdisk#はrawパスです。これははるかに高速で、ddプログラムを使用する場合は完全に問題ありません。 Class 4 SDカードでは、rdiskパスを使用した場合の差は約20倍高速でした。

123
spuder

man hdiutilから:

/ dev/rdiskノードはキャラクタ型の特殊デバイスですが、BSDの意味では "raw"であり、ブロックアライン入出力を強制します。それらはバッファキャッシュよりも物理ディスクに近いです。一方、/ dev/diskノードはバッファ付きブロック特殊デバイスであり、主にカーネルのファイルシステムコードによって使用されます。

素人の言葉で言えば、/dev/rdiskはほとんど直接ディスクに行き、/dev/diskはもっと長いルートをたどります。

90

受け入れられた答えは正しいですが、それは詳細には入りません。

/dev/disk/dev/rdiskの主な違いの1つは、ユーザー空間からそれらにアクセスするとき、/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毎の多くのオーバーヘッドにつながります。先読みも後書きもしません。

95
astruct

/dev/disk/dev/rdiskはHDDとSSDでは動作が異なるようです。 MicroSDカードをチェックしたいです。 Sandisk Ultra MicroSD 64GBに2GBのディスクイメージを書き込んだ( https://www.Amazon.com/gp/product/B073JYVKNX ).

テストを数回繰り返しましたが、結果は安定していました:/dev/diskに対して17MB/svs /dev/rdiskに対して20MB/sbs=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/sbs=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)
    
5
k06a

記録的には、少なくとも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

私はこれが古いスレッドであることを知っていますが、他の人々は私が試したものの速度への影響に興味があるかもしれません。 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.3MB /秒のコピー率でした。これは私を待たせるには長すぎました。したがって、2回目の試行では、コマンドラインは次のようになりました。

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

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

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

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

これらのオプションを試してみてください-それらは動作します!注:if=およびof=を慎重に変更して、Macの場合にリストされている正しいドライブを適切に指すようにしてください。

diskutil list
1
Mark J Foster