本文于 640 天前发布,最后更新于 53 天前
一、文档目的
规范使用 dd 命令测试磁盘的真实物理读写性能,特别是针对数据库场景(模拟 Redo Log 同步写入、Data File Direct I/O),为数据库选型、性能调优和故障排查提供准确的数据基准。
二、测试前的环境准备
- 测试目录:务必在数据库数据目录或挂载点下执行(如
/data/),避免测试系统盘/root或/home产生干扰。 - 预留空间:确保测试文件(通常 1~2GB)不会写满磁盘。
- 清理缓存(可选,更精准):测试前可执行
sync && echo 3 > /proc/sys/vm/drop_caches清空系统缓存(需 root 权限),防止脏数据干扰读取测试。 - 测试文件清理:测试完成后记得
rm -f ./test.sdf,避免占用空间。
三、核心参数说明
oflag=direct:直接 I/O,绕过系统页缓存写入磁盘。读/写测试必备,模拟数据库 Data File 直接写入。
iflag=direct:直接 I/O,绕过系统页缓存从磁盘读取。读/写测试必备,模拟数据库 Data File 直接读取。
oflag=dsync:同步 I/O,确保每次写入完全落盘后才返回。模拟数据库 Redo Log(重做日志) 的严格持久化要求。
conv=fdatasync:测试结束后显式调用 fsync,确保全部落盘。模拟批量导入或表空间文件写入,比 dsync 吞吐量更高
四、基准测试命令模板
以下命令均以 bs=32k 为例。如果您的数据库页大小不同(如 8K、16K),请相应调整 bs 参数,保持大小与业务实际 I/O 特征一致。
4.1 写入性能测试
目标:测试极端严苛的同步写入性能。
# 写入 1.3GB 数据(bs=32k, count=40k),强制每次 I/O 同步落盘
dd if=/dev/zero of=./test.sdf bs=32k count=40k oflag=dsync
结果解析:输出的末尾如 263 MB/s 即为写入速度。
4.2 写入性能测试
目标:测试数据库 Checkpoint 或批量 ETL 场景。
# 写入 1.3GB,最后统一调用 fsync 落盘(吞吐量通常比 dsync 高)
dd if=/dev/zero of=./test.sdf bs=32k count=40k conv=fdatasync
命令
dd if=/dev/zero of=/dmdata/test.sdf bs=32k count=40k oflag=dsync
等待测试完成即可
[root@dameng ~]# dd if=/dev/zero of=/dmdata/test.sdf bs=32k count=40k oflag=dsync
40960+0 records in
40960+0 records out
1342177280 bytes (1.3 GB, 1.2 GiB) copied, 101.031 s, 13.3 MB/s

命令详解:
- dd用于复制,从if读出,写到of。
- if=/dev/zero不产生IO,因此可以用来测试纯写速度。
- 同理of=/dev/null不产生IO,可以用来测试纯读速度。
- bs是每次读或写的大小,即一个块的大小,count是读写块的数量。
注意
bs设置的大小可以用来模拟数据库的页大小,即4K,8K,16K,32K。便可用于测试数据库服务器磁盘读写能力。