私はいつもそう思っていました:
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
一般に、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の場合、速度は確かに非常に疑わしいです。誤って間違ったデバイスを使用しなかったと思います。
oflag=direct
またはconv=fsync
を指定しない限り、カーネルはデータをバッファリングするため、dd
は、カーネルが最後のデータを受け入れるとすぐに完了したと見なします。ドライブに到達する数秒前。少量のデータの場合、スループットの見積もりに重大なエラーが発生する可能性があります。