文章目录

  • 简介
  • 参数
  • 常用参数列表
  • 关于 direct 和 sync 的解析
  • 使用示例



简介

  • 测试连续 IO, 不是随机 IO, 理论上规模越大, 结果越准
  • 理论上 bs 越大, 性能越高(测试: 4M 的时候最快)

参数

常用参数列表

参数

说明

if

输入文件

of

输出文件

bs

最佳是 4M

设置 ibs(度的字节数) 和 obs(写的字节数)

count

块数, bs*count=总大小

conv

fdatasync

系统决定何时写入, data

fsync

系统决定何时写入, meta+data

flag(分为 iflag(读模式) 和 oflag(写模式))

dsync

每接收到一次 IO, 就写一次,data

sync

每接收到一次 IO, 就写一次, meta+data

direct

绕过系统高速缓存, 系统决定落盘


关于 direct 和 sync 的解析

  • direct
  • direct 在__generic_file_write_iter函数内, 并通过 if 判断执行generic_file_direct_write, 最终调用submit_bio交给块设备
  • 不会立刻返回, 在do_blockdev_direct_IO中调用dio_await_completion, 等待全部 bio 完成后, 调用dio_complete完成整个dio
  • fsync
  • sync 会比 direct 多一步刷新
  • fsync 的处理在__generic_file_write_iter函数的封装函数里. 如果__generic_file_write_iter返回值大于零, 即IO操作成功. 之后会进入generic_write_sync函数内, 该函数内会判断是否 sync, 如果设置了 sync 或者dsync, 将进函数流程
  • sync 是由文件系统负责, 如 ext4, 实现函数为 ext4_sync_file, 该函数会搜寻需要刷新的脏页,强制将所有的脏页最终通过 submit_bio 提交给调度器,并等待完成
  • 参考链接
# 基础命令, 但是这样结果不准, 需要根据场景添加参数

# 写测试
time dd if=/dev/zero of=testfile bs=8k count=125000

# 读测试
time dd if=testfile of=testfile2 bs=8k

使用示例

  • 测试硬盘和内存盘的 I/O 速度
# 磁盘

[root@dm2 test]# time dd if=/dev/zero of=a.dbf bs=8k count=125000 conv=fsync
记录了125000+0 的读入
记录了125000+0 的写出
1024000000字节(1.0 GB)已复制,33.4099 秒,30.6 MB/秒

real	0m33.412s
user	0m0.128s
sys	0m0.999s

[root@dm1 thc]# rm -rf a.dbf 

[root@dm1 thc]# time dd if=/dev/zero of=a.dbf bs=8k count=125000 conv=fsync
记录了125000+0 的读入
记录了125000+0 的写出
1024000000字节(1.0 GB)已复制,9.99849 秒,102 MB/秒    # 说明这个参数会使命令从缓存存取数据

real	0m10.001s
user	0m0.121s
sys	0m1.233s

[root@dm1 thc]# time dd if=a.dbf of=b.dbf bs=8k
记录了125000+0 的读入
记录了125000+0 的写出
1024000000字节(1.0 GB)已复制,1.07546 秒,952 MB/秒

real	0m1.077s
user	0m0.128s
sys	0m0.949s

# 内存盘
[root@dm2 ramdisk]# time dd if=/dev/zero of=a.dbf bs=8k count=125000 conv=fsync
记录了125000+0 的读入
记录了125000+0 的写出
1024000000字节(1.0 GB)已复制,1.5614 秒,656 MB/秒

real	0m1.564s
user	0m0.136s
sys	0m1.407s

[root@dm2 ramdisk]# time dd if=a.dbf of=b.dbf bs=8k
记录了125000+0 的读入
记录了125000+0 的写出
1024000000字节(1.0 GB)已复制,1.01944 秒,1.0 GB/秒

real	0m1.021s
user	0m0.122s
sys	0m0.899s