为什么 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


没有实际 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 来说太多了)
  • 4k512
  • 16k4k
  • 64k-256k已经是最好的了
  • 512k-4M稍微慢一点
  • 16M-512M速度减半,比 还差4k

我的猜测是,从一定大小开始,由于缺乏并发性,您开始失去速度。 dd 是单个进程;并发性主要由内核提供(预读、缓存写入……)。如果必须先读取 100M,然后才能写入 100M,则设备有时会处于空闲状态,等待另一个设备完成读取或写入。块大小太小,您会遭受巨大的系统调用开销,但在 64k 左右时,这种情况就会完全消失。

在从同一设备复制或向同一设备复制时,100M 或更大的块大小可能会有所帮助。至少对于硬盘来说,这样做应该可以减少在查找上浪费的时间,因为它不能同时在两个地方。


你为什么要这样覆盖你的SSD?通常,您会尽量避免对 SSD 进行不必要的写入;如果它考虑到已使用的所有空间,它也可能会失去一些性能,直到您再次修剪它。

您可以使用此命令来修剪/丢弃整个 SSD:

blkdiscard /dev/sda

如果您的SSD在TRIM(您可以使用该属性进行检查hdparm -I)之后具有确定性读取零,那么它看起来就像充满了零,但SSD实际上将其所有块视为空闲,这应该为您提供最佳性能。

TRIM 的缺点是,如果删除的文件已被丢弃,您将失去所有数据恢复的机会......

相关内容