ddのbsが100Mでなぜそんなに遅いのですか? [閉じる]

ddのbsが100Mでなぜそんなに遅いのですか? [閉じる]

私はddを使って高速SSDを上書きしようとしました。私が入力したUbuntuブートイメージを使用して:

dd if=/dev/zero of=/dev/sda bs=100M
error writing '/dev/sda': No space left on device
blah blah
256 GB copied, 1195.81 s 214 MB/s

これはとても遅いですか?そしてボトルネックはどこにありますか?ブロックサイズの選択はどうですか?

ベストアンサー1

人間が一般的に好む最適なブロックサイズはdd約です64k256k1M


実際の入出力なしのベンチマーク:

$ for bs in 512 4k 16k 64k 128k 256k 512k 1M 4M 16M 64M 128M 256M 512M
> do
>     echo ---- $bs: ----
>     dd bs=$bs if=/dev/zero of=/dev/null iflag=count_bytes count=10000M
> done
---- 512: ----
20480000+0 records in
20480000+0 records out
10485760000 bytes (10 GB) copied, 4.2422 s, 2.5 GB/s
---- 4k: ----
2560000+0 records in
2560000+0 records out
10485760000 bytes (10 GB) copied, 0.843686 s, 12.4 GB/s
---- 16k: ----
640000+0 records in
640000+0 records out
10485760000 bytes (10 GB) copied, 0.533373 s, 19.7 GB/s
---- 64k: ----
160000+0 records in
160000+0 records out
10485760000 bytes (10 GB) copied, 0.480879 s, 21.8 GB/s
---- 128k: ----
80000+0 records in
80000+0 records out
10485760000 bytes (10 GB) copied, 0.464556 s, 22.6 GB/s
---- 256k: ----
40000+0 records in
40000+0 records out
10485760000 bytes (10 GB) copied, 0.48516 s, 21.6 GB/s
---- 512k: ----
20000+0 records in
20000+0 records out
10485760000 bytes (10 GB) copied, 0.495087 s, 21.2 GB/s
---- 1M: ----
10000+0 records in
10000+0 records out
10485760000 bytes (10 GB) copied, 0.494201 s, 21.2 GB/s
---- 4M: ----
2500+0 records in
2500+0 records out
10485760000 bytes (10 GB) copied, 0.496309 s, 21.1 GB/s
---- 16M: ----
625+0 records in
625+0 records out
10485760000 bytes (10 GB) copied, 0.972703 s, 10.8 GB/s
---- 64M: ----
156+1 records in
156+1 records out
10485760000 bytes (10 GB) copied, 1.0409 s, 10.1 GB/s
---- 128M: ----
78+1 records in
78+1 records out
10485760000 bytes (10 GB) copied, 1.04533 s, 10.0 GB/s
---- 256M: ----
39+1 records in
39+1 records out
10485760000 bytes (10 GB) copied, 1.04685 s, 10.0 GB/s
---- 512M: ----
19+1 records in
19+1 records out
10485760000 bytes (10 GB) copied, 1.0436 s, 10.0 GB/s
  • デフォルトの512バイト速度は非常に遅いです(512バイトあたり2つのシステムコールはCPUに多すぎます)。
  • 4k比較する512
  • 16k比較する4k
  • 64k- すでに256k最高
  • 512k-4Mもう少し遅い
  • 16M-速度は半分512M、それよりも悪い4k

私の考えでは、特定のサイズから始めると、並行性の欠如のために速度が低下し始めるようです。 dd は単一プロセスです。並行性は主にカーネルによって提供されます(事前読み込み、キャッシュされた書き込み...)。 100Mを書き込む前に100Mを読み取る必要がある場合、デバイスは時々他のデバイスが読み書きを完了するのを待ち、アイドル状態になります。ブロックサイズが小さすぎると、膨大なシステムコールオーバーヘッドが発生しますが、約64kではこれが完全に消えます。

同じデバイスからコピーしたり、同じデバイスにコピーしたりすると、100M以上のブロックサイズが役に立ちます。少なくともハードドライブの場合は、2つの場所に同時に配置することはできないため、これを見つけるのに無駄な時間を節約できます。


SSDをこのように上書きする理由は何ですか?通常、SSDへの不要な書き込みを避けたいと思います。使用されているすべてのスペースを考慮すると、再クリーンアップするまで一部のパフォーマンスが低下する可能性があります。

このコマンドを使用して、SSD全体をクリーンアップ/廃棄できます。

blkdiscard /dev/sda

SSDにhdparm -ITRIM以降の決定論的な読み取りゼロがある場合(該当するプロパティを使用して確認できます)、0でいっぱいに見えますが、SSDは実際にすべてのブロックを利用可能なブロックとして扱うため、最高のパフォーマンスを提供します。

TRIMの欠点は、削除されたファイルを破棄すると、データ復旧の可能性をすべて失うことです。

おすすめ記事