web-dev-qa-db-ja.com

ddによって報告された実際の速度はどれくらいですか?

私はいつもそう思っていました:

dd if=/dev/sdx of=/dev/sdy

コマンドが終了すると表示されるレポート(次のようなもの)。

79304319+0 records in
79304319+0 records out
40603811328 bytes (41 GB) copied, 459.645 s, 88.3 MB/s

次の間の最も遅い速度に対応する速度が含まれています。

  • 入力からの読み取り速度、
  • 出力への書き込み速度、
  • 読み取りと書き込みの間に何が起こるか、

つまり、読み取り速度が5 MB/sのUSBドライブからSSDにデータをコピーする場合、ddは、SSDの速度に関係なく、実際には5 MB/sを報告します。

実際には、USB 2に接続されたディスクをコピーしていました(2回チェックしました。マニュアルには、USB 2.0であり、480 Mbpsの接続速度も正確であると記載されています)。ddが65から変化する速度を報告していることに気付きました。 〜88 MB/s、これはUSB 2.0の 最大速度60 MB/s よりも高速です。

そこで何が起こっているのですか?

ddで示される速度は、読み取り速度と書き込み速度の加算ですか(つまり、実際の速度は約40 MB/sであり、より理にかなっています)?


追加情報:実験できるクローンを作成するために、不良セクタの数が増えているハードディスクのコピーを作成していました。ディスク全体をコピーした後、報告された速度は実際に予想よりも高速です。

3902854784+0 records in
3902854784+0 records out
1998261649408 bytes (2.0 TB) copied, 26040.5 s, 76.7 MB/s

コマンドが最初の数ギガバイト(2〜3ギガバイト)だけ繰り返されたと仮定します。チェックして再チェックしたところ、コピーされたディスクは正しいものであり、マザーボードはUSB 3をサポートしていません(USB 3用の追加のPCI-eカードはありません)。

hdparmの結果はさらに奇妙です:

$ hdparm -tT /dev/md0

/dev/md0:
 Timing cached reads:   13498 MB in  2.00 seconds = 6755.77 MB/sec
 Timing buffered disk reads: 486 MB in  3.00 seconds = 161.77 MB/sec

$ hdparm -tT /dev/md0

/dev/md0:
 Timing cached reads:   15058 MB in  2.00 seconds = 7536.75 MB/sec
 Timing buffered disk reads: 418 MB in  3.01 seconds = 138.91 MB/sec

$ hdparm -tT /dev/md0

/dev/md0:
 Timing cached reads:   15038 MB in  2.00 seconds = 7527.54 MB/sec
 Timing buffered disk reads: 386 MB in  3.01 seconds = 128.38 MB/sec
5

一般に、ddは転送全体にかかった時間を表示し、速度は「データの量をかかった時間で割ったもの」です。基本的にはtime dd ...で得られるものと同じで、魔法はありません。

40603811328 bytes (41 GB) copied, 459.645 s, 88.3 MB/s
40603811328 / 459.645 / 1000 / 1000 = 88.3373

ある時点でddをキャンセルして再起動したところ、データのかなりの部分がすでにキャッシュされていて、キャッシュが統計を台無しにしているのではないでしょうか。 hdparm -tT /dev/diskを試して、実際のドライブ速度の概算を取得できます。

USB2の場合、速度は確かに非常に疑わしいです。誤って間違ったデバイスを使用しなかったと思います。

2
frostschutz

oflag=directまたはconv=fsyncを指定しない限り、カーネルはデータをバッファリングするため、ddは、カーネルが最後のデータを受け入れるとすぐに完了したと見なします。ドライブに到達する数秒前。少量のデータの場合、スループットの見積もりに重大なエラーが発生する可能性があります。

2
psusi