web-dev-qa-db-ja.com

NVMe SSDでddが非常に遅いのはなぜですか?

私は最近 このビデオ を見ました、そしてその中で、著者はddコマンドを使用するときRAMディスクはHDD/SSDよりはるかに速いと説明しています。これが事実である理由を理解しています。しかし、私が理解していないのは、彼のサンプルコマンドdd if=/dev/zero of=test.iso bs=1M count=8000 16GBのRAM、12コアのRyzen 3600X CPU、最大5GB/sの書き込み速度のNVMe SSDを搭載したシステム。

RAMは常に高速になると思いますが、これは非常に遅いので、ここに何か他のものがあるはずです。彼がddコマンドを使用していた方法ですか?I ddの内部を知らないが、これはシステムがパフォーマンスを制限している状況なのか、それともコマンドが誤って使用されたのか?

注:まったく同じコマンドを2回続けて実行した後、2回目の書き込みは1.4GB /秒ではるかに高速でしたが、これで混乱が解消されるわけではありません。

1
the_endian

NVMEドライブ、SATA-SSD、SATA HDDが搭載されている、かなり古いワークステーション(Lenovo Thinkstation C30)でいくつかのテストを行いました。

次のコマンドを実行しました(バッファーからのフラッシュを含めて、各デバイスへの書き込みに必要なリアルタイムを測定するため)。

NVMEドライブ:

sudodus@bionic64 /mnt/sd1 $ time ( Sudo dd if=/dev/zero of=test.img bs=1M count=8000 status=progress ; sync )
7480541184 byte (7,5 GB, 7,0 GiB) kopierade, 4 s, 1,9 GB/s
8000+0 poster in
8000+0 poster ut
8388608000 byte (8,4 GB, 7,8 GiB) kopierade, 4,86151 s, 1,7 GB/s

real    0m9,243s
user    0m0,014s
sys 0m3,921s

SATA-SSD:

sudodus@bionic64 /tmp $ time ( Sudo dd if=/dev/zero of=test.img bs=1M count=8000 status=progress ; sync )
8384413696 byte (8,4 GB, 7,8 GiB) kopierade, 11 s, 762 MB/s
8000+0 poster in
8000+0 poster ut
8388608000 byte (8,4 GB, 7,8 GiB) kopierade, 11,0025 s, 762 MB/s

real    0m25,841s
user    0m0,023s
sys 0m3,894s

SATA-HDD:

sudodus@bionic64 /media/multimed-2/test/test0/temp $ time ( Sudo dd if=/dev/zero of=test.img bs=1M count=8000 status=progress ; sync )
8296333312 byte (8,3 GB, 7,7 GiB) kopierade, 18 s, 461 MB/s
8000+0 poster in
8000+0 poster ut
8388608000 byte (8,4 GB, 7,8 GiB) kopierade, 18,3536 s, 457 MB/s

real    0m50,050s
user    0m0,024s
sys 0m3,566s

速度の計算:

$ bc
...
scale=0
8000/9.243
865
8000/25.841
309
8000/50.050
159

MiB/sでの実際の書き込み速度の要約

NVME: 865
SSD:  309
HDD:  159

つまり、NVMEおよびSSDドライブへの書き込み速度は理論上の速度よりもはるかに遅いという結論になります。デバイス自体だけでなく、速度を制限するいくつかのボトルネックが存在する可能性があると結論付ける必要があります。

ddを責めるつもりはありません。他にもボトルネックがあると思います。しかし、あなたの書き込み速度220 MiB/sは、NVME SSDには低すぎるようです。 (RAMへの書き込み速度を示しているだけで、バッファーのフラッシュは含まれていないため、2番目の結果である1.4GB/sは破棄できると思います。)

booted liveがいくつかの異なるnew linux distros/versionsの場合、NVMEドライブへの書き込み速度をテストできるかもしれません。新しいLinuxカーネルがハードウェア用のより高速なドライバーを備えている可能性があります。

ところで、NVMEドライブにはどのファイルシステムがありますか? Linuxは、Linuxファイルシステム(ext4など)で最適に動作します。

2
sudodus

SSDなどのNANDフラッシュメディアには最小ブロック消去サイズがあります。つまり、小さいブロックサイズでそれらのデータをddした場合、SSDコントローラーはブロック内の位置に書き込むためにブロックを数回消去する必要があります。最小ブロック消去サイズが4Mの場合、1Mは、ブロックを必要以上に4回書き換える必要があることを意味します。 SSDは同じ4Mブロックを4回消去する必要があります。

同じddコマンドを2回目に実行したときに速度が大幅に向上するという事実は、findコマンドを繰り返し実行した場合と同様に、カーネル、ドライバー、コントローラーによるキャッシュと内部最適化によって説明できます。

詳細については excellent answer @ greg-kennedyによる 最小消去ブロックサイズを見つけるためのスクリプト を参照してください。これは、最適化のためにddsブロックサイズ値として使用する必要がありますパフォーマンス。

場合によっては、デバイスの仕様でも、または/sys/class/mtd/mtdx/erasesize、個々のデバイスによって異なります。

2
emk2203