文章目录
常见磁盘IO测试
dd 命令测试,只能测连续IO
dd操作需要三思而行,搞清楚确认没问题再进行操作!一旦方向搞反了数据就没有了。
dd if=/dev/zero of=/dev/sda1 (有数据盘千万不能使用)
- bs=N:设置单次读入或单次输出的数据块(block)的大小为 N 个字节。当然也可以使用 ibs 和 obs 选项来分别设置。
- ibs=N:单次读入的数据块(block)的大小为 N 个字节,默认为 512 字节。
- obs=N:单次输出的数据块(block)的大小为 N 个字节,默认为 512 字节。
- count=N:表示总共要复制 N 个数据块(block)。
- /dev/null:也叫空设备,小名“无底洞”。任何写入它的数据都会被无情抛弃。
- /dev/zero:可以产生连续不断的null的流(二进制的零流),用于向设备或文件写入 null 数据,一般用它来对设备或文件进行初始化。
- if: 输入文件名,缺省为标准输入,不产生读磁盘IO
- of:输出文件名,缺省为标准输出,不产生写磁盘IO
- conv=<关键字> : 指定文件转换的方式。
推荐测试写性能,不使用内存缓冲区
time dd if=/dev/zero of=./testio bs=4k count=100000 conv=fdatasync
测试吞吐性能
加大bs 改为2M
time dd if=/dev/zero of=./testio bs=2M count=1000 conv=fdatasync
推荐测试读性能
测试文件的大小远远大于内存才比较合理,添加oflag=direct将跳过内存缓存
time dd if=/data of=/dev/null bs=4k count=100000 iflag=direct
几种不同模式区别
- dd bs=1M count=128 if=/dev/zero of=test
- dd bs=1M count=128 if=/dev/zero of=test; sync
- dd bs=1M count=128 if=/dev/zero of=test conv=fdatasync
- dd bs=1M count=128 if=/dev/zero of=test oflag=dsync
dd bs=8k count=4k if=/dev/zero of=test
没加关于操作系统“写缓存”的参数,默认“写缓存”启作用。dd先把数据写的操作系统“写缓存”,就完成了写操作。通常称为update的系统守护进程会周期性地(一般每隔30秒)调用sync函数,把“写缓存”中的数据刷入磁盘。因为“写缓存”起作用,你会测试出一个超级快的性能。上面等价于:
dd bs=8k count=4k if=/dev/zero of=test conv=sync
conv=sync参数明确“写缓存”启作用,默认值就是conv=sync
dd bs=8k count=4k if=/dev/zero of=test.log conv=fsync
加入conv=fsync这个参数后,dd命令执行到最后会真正执行一次“同步(sync)”操作,,这样算出来的时间才是比较符合实际使用结果的。conv=fsync表示把文件的“数据”和“metadata”都写入磁盘(metadata包括size、访问时间st_atime & st_mtime等等),因为文件的数据和metadata通常存在硬盘的不同地方,因此fsync至少需要两次IO写操作,fsync 与fdatasync相差不大。
dd bs=8k count=4k if=/dev/zero of=test.log conv=fdatasync
加入fdatasync这个参数后,dd命令执行到最后会真正执行一次“同步(sync)”操作,,这样算出来的时间才是比较符合实际使用结果的。conv=fdatasync表示只把文件的“数据”写入磁盘,fsync 与fdatasync相差不大。(这种方式最接近计算机实际操作最有参考价值)
dd bs=8k count=4k if=/dev/zero of=test.log oflag=dsync
加入这个参数后,每次读取8k后就要先把这8k写入磁盘,然后再读取下面一个8k,一共重复4K次。基本上没有用到写缓存(write cache),这是最慢的一种方式了。
fio 存储性能测试
支持裸设备和文件系统
生产环境建议忘记这个命令
- 测试裸盘可以获得真实的块存储盘性能,但会破坏文件系统结构,请在测试前提前创建快照做好数据备份。
- 强烈建议您不要将操作系统所在的云盘或者含有重要数据的云盘作为测试对象。建议您只在新购买的无数据的盘测试块存储性能。
参数
-direct=1 表示测试时忽略I/O缓存,数据直写。
-iodepth=128 表示使用异步I/O(AIO)时,同时发出I/O数的上限为128。测试延迟时设置为1
-rw=randwrite 表示测试时的读写策略为随机写(random writes)。其它测试可以设置为:
randread(随机读random reads)
read(顺序读sequential reads)
write(顺序写sequential writes)
randrw(混合随机读写mixed random reads and writes)
-ioengine=libaio 表示测试方式为libaio(Linux AIO,异步I/O)。
应用程序使用I/O通常有两种方式:
同步
同步的I/O一次只能发出一个I/O请求,等待内核完成才返回。这样对于单个线程iodepth总是小于1,但是可以透过多个线程并发执行来解决。通常会用16~32根线程同时工作将iodepth塞满。
异步
异步的I/O通常使用libaio这样的方式一次提交一批I/O请求,然后等待一批的完成,减少交互的次数,会更有效率。
-bs=4k 表示单次I/O的块文件大小为4 KiB。默认值也是4 KiB。
测试IOPS时,建议将bs设置为一个较小的值,如4k。
测试吞吐量时,建议将bs设置为一个较大的值,如1024k。
-size=1G 表示测试文件大小为1 GiB。
-numjobs=1 表示测试线程数为1。
-runtime=1000 表示测试时间为1000秒。如果未配置,则持续将前述-size指定大小的文件,以每次-bs值为分块大小写完。
-group_reporting 表示测试结果里汇总每个进程的统计信息,而非以不同job汇总展示信息。
-filename=/dev/your_device 指定的云盘设备名,例如/dev/your_device。
-name=Rand_Write_Testing 表示测试任务名称为Rand_Write_Testing,可以随意设定。
-randrepeat 这次随机读、随机写测试产生的位置是可重复的。这里的“可重复”的实现方式仅仅是通过randseed=默认值来实现。randrepeat:默认是True
-time_based 如果设置的话,即使file已被完全读写或写完,也要执行完runtime规定的时间。它是通过循环执行相同的负载来实现的,与runtime相对应。
测试读写性能
随机写IOPS
fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4k -size=10G -numjobs=1 -runtime=100 -time_based -group_reporting -filename=/dev/your_device -name=Rand_Write_Testing
随机读IOPS
fio -direct=1 -iodepth=128 -rw=randread -ioengine=libaio -bs=4k -size=10G -numjobs=1 -runtime=100 -time_based -group_reporting -filename=/dev/your_device -name=Rand_Read_Testing
顺序写吞吐量
fio -direct=1 -iodepth=64 -rw=write -ioengine=libaio -bs=1024k -size=10G -numjobs=1 -runtime=100 -time_based -group_reporting -filename=/dev/your_device -name=Write_PPS_Testing
顺序读吞吐量
fio -direct=1 -iodepth=64 -rw=read -ioengine=libaio -bs=1024k -size=10G -numjobs=1 -runtime=100 -time_based -group_reporting -filename=/dev/your_device -name=Read_PPS_Testing
混合顺序读写,读占70%
fio -direct=1 -ioengine=libaio -iodepth=128 -numjobs=8 -size=1G -bs=16k -group_reporting -rw=rw -rwmixread=70 -time_based=1 -runtime=60 -filename=/tmp/test -name=ccg_fio
混合随机读写,写占70%
fio -direct=1 -ioengine=libaio -iodepth=128 -numjobs=8 -size=1G -bs=16k -group_reporting -rw=randrw -rwmixwrite=70 -time_based=1 -runtime=60 -filename=/tmp/testio -name=ccg_fio
随机写延迟
fio -direct=1 -iodepth=1 -rw=randwrite -ioengine=libaio -bs=4k -size=10G -numjobs=1 -runtime=300 -group_reporting -filename=/tmp/testio -name=Rand_Write_Latency_Testing
随机读延迟
fio -direct=1 -iodepth=1 -rw=randread -ioengine=libaio -bs=4k -size=10G -numjobs=1 -runtime=300 -group_reporting -filename=/tmp/testio -name=Rand_Read_Latency_Testing