Dd

為什麼 dd 這麼慢,bs 為 100M

  • February 8, 2018

我只是嘗試使用 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

這不是很慢嗎?瓶頸在哪裡?塊大小的選擇呢?

最佳的塊大小dd大約是64k-256k人類通常更喜歡1M


沒有實際 I/O 的基準測試:

$ 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 字節兩個系統呼叫對 CPU 來說太多了)
  • 4k明顯好於512
  • 16k明顯好於4k
  • 64k-256k和它一樣好
  • 512k-4M稍微慢一點
  • 16M-512M速度減半,比4k.

我的猜測是,從某個大小開始,由於缺乏並發性,您開始失去速度。dd 是單個程序;並發主要由核心提供(預讀、記憶體寫入……)。如果它必須先讀取 100M 才能寫入 100M,則設備會處於空閒狀態,等待另一個設備完成讀取或寫入。太小的塊大小,你會遭受純粹的系統呼叫成本,但在 64k 左右時,這完全消失了。

在從同一設備複製到同一設備時,100M 或更大的塊大小可能會有所幫助。至少對於硬碟驅動器,這樣做應該可以減少浪費在尋找上的時間,因為它不能同時在兩個地方。


你為什麼要這樣覆蓋你的SSD?通常,您會盡量避免對 SSD 進行不必要的寫入;如果它認為它的所有空間都已使用,它可能還會失去一些性能,直到你再次 TRIM 釋放它。

您可以改用此命令來修剪/丟棄整個 SSD:

blkdiscard /dev/sda

如果您的 SSD 在 TRIM 之後具有確定性讀取零(您可以檢查的屬性hdparm -I),它將看起來充滿了零,但 SSD 實際上認為它的所有塊都是免費的,這應該可以為您提供最佳性能。

TRIM 的缺點是,如果已刪除的文件已被丟棄,您將失去所有數據恢復的機會……

引用自:https://unix.stackexchange.com/questions/183913