Dd
為什麼 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
這不是很慢嗎?瓶頸在哪裡?塊大小的選擇呢?
最佳的塊大小
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 的缺點是,如果已刪除的文件已被丟棄,您將失去所有數據恢復的機會……