我在做的时候一直认为:
dd if=/dev/sdx of=/dev/sdy
命令完成后显示的报告,例如:
79304319+0 records in
79304319+0 records out
40603811328 bytes (41 GB) copied, 459.645 s, 88.3 MB/s
包含与以下各项之间最慢的速度相对应的速度:
- 输入的读取速度,
- 输出的写入速度,
- 读和写之间发生了什么,
也就是说,如果我将读取速度为 5 MB/s 的 USB 驱动器中的数据复制到 SSD,则dd
实际上会报告 5 MB/s,与 SSD 的速度无关。
在实践中,我正在复制连接到 USB 2 的磁盘(检查了两次,手册说它是 USB 2.0,甚至精确到 480 Mbps 的连接速度),并注意到报告的dd
速度从 65 到 88 MB/s 不等,高于最高速度60MB/s用于 USB 2.0。
那里发生了什么?
速度是由dd
读取速度和写入速度相加得出的吗(这意味着实际速度约为 40 MB/s,这样更有意义)?
附加信息:我正在制作一个硬盘的副本,该硬盘的坏扇区数量不断增加,以便有一个可以进行实验的克隆。复制整个磁盘后,报告的速度确实比预期要高:
3902854784+0 records in
3902854784+0 records out
1998261649408 bytes (2.0 TB) copied, 26040.5 s, 76.7 MB/s
鉴于该命令仅针对前几(2 到 3)GB 重复。我检查了一遍,复制的磁盘是正确的,而且主板不支持USB 3(并且没有额外的USB 3 PCI-e卡)。
hdparm
的结果更奇怪:
$ hdparm -tT /dev/md0
/dev/md0:
Timing cached reads: 13498 MB in 2.00 seconds = 6755.77 MB/sec
Timing buffered disk reads: 486 MB in 3.00 seconds = 161.77 MB/sec
$ hdparm -tT /dev/md0
/dev/md0:
Timing cached reads: 15058 MB in 2.00 seconds = 7536.75 MB/sec
Timing buffered disk reads: 418 MB in 3.01 seconds = 138.91 MB/sec
$ hdparm -tT /dev/md0
/dev/md0:
Timing cached reads: 15038 MB in 2.00 seconds = 7527.54 MB/sec
Timing buffered disk reads: 386 MB in 3.01 seconds = 128.38 MB/sec
答案1
除非您指定oflag=direct
或conv=fsync
,否则内核会缓冲数据,因此dd
一旦内核接受了最后一个数据(这可能是在数据到达驱动器之前几秒钟),内核就会认为数据已完成。对于少量数据,这可能会给吞吐量估计带来重大误差。
答案2
一般来说,dd
显示整个传输所花费的时间,速度是“数据量除以所花费的时间”。基本上它和你应该得到的一样time dd ...
,没有魔法。
40603811328 bytes (41 GB) copied, 459.645 s, 88.3 MB/s
40603811328 / 459.645 / 1000 / 1000 = 88.3373
也许您在某个时刻取消了 dd 并重新启动它,此时大部分数据已经被缓存,因此缓存会扰乱您的统计数据?您可以尝试hdparm -tT /dev/disk
粗略估计实际驱动速度。
对于USB2来说,速度确实值得怀疑,希望大家不要误用错误的设备。