![为什么dd第一次运行会显示磁盘速度很慢?](https://linux22.com/image/625000/%E4%B8%BA%E4%BB%80%E4%B9%88dd%E7%AC%AC%E4%B8%80%E6%AC%A1%E8%BF%90%E8%A1%8C%E4%BC%9A%E6%98%BE%E7%A4%BA%E7%A3%81%E7%9B%98%E9%80%9F%E5%BA%A6%E5%BE%88%E6%85%A2%EF%BC%9F.png)
我正在使用 dd 命令检查 CentOS 6 上硬盘的磁盘速度。设置是 DRBD 设置 - 此服务器是主服务器。为了确保获得正确的值,我使用不同的输出文件执行 dd 命令 3 次,然后取读/写时间的平均值。但是,第一次读取 dd 命令的速度比接下来的 2 次慢几个数量级。例如。
time -p dd if=/dev/zero of=/mailstore/testfile bs=16k count=16384
16384+0 records in
16384+0 records out
268435456 bytes (268 MB) copied, 88.5175 s,
3.0 MB/s
real 90.12
user 0.00
sys 0.66
time -p dd if=/dev/zero of=/mailstore/testfile1 bs=16k count=16384
16384+0 records in
16384+0 records out
268435456 bytes (268 MB) copied, 0.226015 s, 1.2 GB/s
real 0.30
user 0.00
sys 0.22
time -p dd if=/dev/zero of=/mailstore/testfile2 bs=16k count=16384
16384+0 records in
16384+0 records out
268435456 bytes (268 MB) copied, 0.22094 s, 1.2 GB/s
real 0.22
user 0.00
sys 0.21
这正常吗?我是否应该忽略第一次读数,然后再进行 3 次读数?
根据 poige 的建议,dd 命令使用 opflag=direct 选项提供一致的输出。例如。
time -p dd if=/dev/zero of=/mailstore/filetest33 bs=16k count=16384 oflag=direct
16384+0 records in
16384+0 records out
268435456 bytes (268 MB) copied, 296.587 s, 905 kB/s
real 296.61
user 0.03
sys 1.07
time -p dd if=/dev/zero of=/mailstore/filetest44 bs=16k count=16384 oflag=direct
16384+0 records in
16384+0 records out
268435456 bytes (268 MB) copied, 260.308 s, 1.0 MB/s
real 260.42
user 0.04
sys 1.13
time -p dd if=/dev/zero of=/mailstore/filetest56 bs=16k count=16384 oflag=direct
16384+0 records in
16384+0 records out
268435456 bytes (268 MB) copied, 253.681 s, 1.1 MB/s
real 253.68
user 0.03
sys 1.06
答案1
dd
有direct
选项要求内核绕过任何缓存并直接将数据发送到块设备。如果您需要对设备(而不是 RAM)进行基准测试,则必须使用它,例如:
dd if=/dev/zero of=direct_output bs=1M count=100 oflag=direct
答案2
所以,您说它是通过网络安装的。哪个文件系统,CIFS 还是 NFS?无论哪种方式,我怀疑您可能已被委派了文件。当您的客户端获得委派的文件时,它能够在本地缓存写入。但是,当您使用 O_DIRECT(这就是 oflag=direct 的意思)时,写入会立即发送到服务器,而不是任何缓存。
不管怎样,有些奇怪的事情发生了。除非你实际只使用 10Mbps 以太网,否则你应该获得超过 1.1MB/s 的速度。
此外,您还可以在另一个窗口中运行 killall -USR1 dd 来获取传输中期速度更新。如果您查看 dd 手册页,您会看到 USR1 信号不会终止/停止 dd,而是打印出 I/O 统计信息。我在等待大型磁盘传输时经常这样做:
睡眠 10 时;执行 killall -USR1 dd;完成
哦,如果你怀疑磁盘缓存,请使用以下命令刷新读取缓存:echo 1 > /proc/sys/vm/drop_caches
祝你好运!