我正在使用 dd 命令检查 CentOS 6 上硬盘的磁盘速度。该设置是一个 DRBD 设置 - 此服务器是主服务器。为了确保获得正确的值,我使用不同的输出文件执行 dd 命令 3 次,然后取读/写时间的平均值。但是 dd 命令的第一次读取比下一次读取慢一个数量级。例如。
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
dd
具有direct
要求内核绕过任何缓存并将数据直接发送到块设备的选项。如果您需要对设备而不是 RAM 进行基准测试,则必须使用它,例如:dd if=/dev/zero of=direct_output bs=1M count=100 oflag=direct
所以,你说它是通过网络安装的。哪个文件系统,CIFS 或 NFS?不管怎样,我怀疑你可能已经被委派了文件。当您的客户端获得委托的文件时,它能够在本地缓存写入。但是,当您使用 O_DIRECT (这就是 oflag=direct 的意思)时,写入会立即发送到服务器,而不是任何缓存。
无论哪种方式,都会发生一些奇怪的事情。除非您实际上仅使用 10Mbps 以太网,否则您应该获得超过 1.1MB/s 的速度。
此外,您可以通过在另一个窗口中运行 killall -USR1 dd 来获取传输中的速度更新 如果您查看 dd 手册页,您会看到 USR1 信号不会终止/停止 dd 而是打印出 I/ Ø 统计。在等待大磁盘传输时,我经常这样做:
睡觉10;做killall -USR1 dd;完毕
哦,如果您怀疑磁盘缓存,请使用以下命令刷新 readcache: echo 1 > /proc/sys/vm/drop_caches
祝你好运!