我目前正在用之前创建的 dd 映像恢复 USB 记忆棒。但是我注意到写入速度非常慢,大约 7 MB/s,尽管记忆棒通常要快得多。
仔细查看后,我发现 USB 驱动器中正在读取大量数据,这解释了写入性能不佳的原因。当时只有 dd 正在访问该设备。
編輯atop
行:
sdd: busy 101% | read 18020 | write 613 | MBr/s 7.04 | MBw/s 7.1
我注意到使用 dd 直接写入我的 md 数组时也会出现类似的行为。但是,使用 dd 写入已挂载的文件系统时,不会发生这种情况。
所以我的问题是为什么直接写入块设备时会从 USB 驱动器读取,以及是否可以防止这种情况以提高写入性能?
答案1
因此,不是 100% 清楚可能发生的情况,但我怀疑您正在将小块(512 字节)写入 USB,然后 dd 检查以确保字节写入正确 - 导致大量的读写、读写。
将块大小调整为“正确”大小并非易事,但有一些经验法则可以指导您如何做到这一点。一般来说,我发现 64kB 的块大小在大多数方面都是一个很好的折衷方案 - 但如果您运行的是任何奇特的东西(例如zfs
),您的文件系统可以推动对此进行更改。
尝试这样的操作:
lbzcat image-dd.bz2 | dd of=/deb/sdX bs=64k
如需更详细的讨论,请查看这个帖子。
答案2
对我来说,dd
默认使用页面缓存。我认为这在具有页面缓存的系统上是正常的。但是页面缓存需要读取存储设备,这会导致写入速度变慢。
对于我来说,有三种方法可以解决这个问题并获得全速:
- 将块大小设置
dd
为 4096 或其倍数。(无读取) - 将块大小设置
dd
为足够大的数字。对我来说,这个数字大约是 100 万及以上。我在 100 万左右时速度达到最高。(读取次数很少) - 不要通过给出
dd
参数来使用页面缓存oflags=direct
。将dd
块大小设置为 512 的足够大倍数。对我来说,这个值大约在 512bs=120k
以上。(无读取)
在我的系统上需要注意的几点块大小适用于所有存储设备和页面大小为 4096 字节。发现:
blockdev --getbsz /dev/sd?
getconf PAGESIZE
还扇区大小是 512 字节。
fdisk
也许parted
可以告诉您扇区大小。