Linux

最近需要上线某新项目,在准备云环境的时候,需要对云主机的IO性能做测试。现在就测试过程做个总结。此次使用到的性能测试工具是fiodd。本次测试对象为阿里云ECS的40GB SSD云盘。

参数约定

IOPS

IOPS是Input/Output Operations per Second,即每秒能处理的I/O个数,用于表示块存储处理读写(输出/输入)的能力。

IOPS性能指标描述备注
总 IOPS每秒执行的I/O操作总次数。
随机读IOPS每秒执行的随机读I/O操作的平均次数对磁盘存储位置的不连续访问。
随机写IOPS每秒执行的随机写I/O操作的平均次数
顺序读IOPS每秒执行的顺序读I/O操作的平均次数对磁盘存储位置的连续访问。
顺序写IOPS每秒执行的顺序写I/O操作的平均次数

fio测试磁盘性能

fio 是一款出色的磁盘性能测试工具。其参数如下:

参数说明
-direct=1表示测试时忽略I/O缓存,数据直写。
-iodepth=128表示使用AIO时,同时发出I/O数的上限为128。
-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塞满。异步则通常使用libaio这样的方式一次提交一批I/O请求,然后等待一批的完成,减少交互的次数,会更有效率。
-bs=4k表示单次I/O的块文件大小为4k。未指定该参数时的默认大小也是4k。测试IOPS时,建议将bs设置为一个比较小的值,如本示例中的4k。测试吞吐量时,建议将bs设置为一个较大的值,如本示例中的1024k。
-size=1G表示测试文件大小为1G。
-numjobs=1表示测试线程数为1。
-runtime=1000表示测试时间为1000秒。如果未配置,则持续将前述-size指定大小的文件,以每次-bs值为分块大小写完。
-group_reporting表示测试结果里汇总每个进程的统计信息,而非以不同job汇总展示信息。
-filename=iotest指定测试文件的名称,比如iotest。测试裸盘可以获得真实的磁盘性能,但直接测试裸盘会破坏文件系统结构,请在测试前提前做好数据备份。
-name=Rand_Write_Testing表示测试任务名称为Rand_Write_Testing,可以随意设定。

测试随机写 IOPS:

fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=iotest -name=Rand_Write_Testing

测试随机读 IOPS:

fio -direct=1 -iodepth=128 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=iotest -name=Rand_Read_Testing

测试顺序写吞吐量:

fio -direct=1 -iodepth=64 -rw=write -ioengine=libaio -bs=1024k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=iotest -name=Write_PPS_Testing

测试顺序读吞吐量:

fio -direct=1 -iodepth=64 -rw=read -ioengine=libaio -bs=1024k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=iotest -name=Read_PPS_Testing

此次测试取用的样本文件大小分别为1G和10G,其结果如下:

mark

dd测试磁盘性能

dd命令用于在Linux和类Unix系统下对硬盘设备进行读写性能的检测。其参数如下:

if=/dev/zero (if=/dev/input.file) :用来设置dd命令读取的输入文件名。
of=/tmp/test1.img (of=/path/to/output.file):dd命令将input.file写入的输出文件的名字。
bs=1G (bs=block-size) :设置dd命令读取的块的大小。例子中为1个G。
count=1 (count=number-of-blocks):dd命令读取的块的个数。
oflag=dsync (oflag=dsync) :使用同步I/O。不要省略这个选项。这个选项能够帮助你去除caching的影响,以便呈现给你精准的结果。
conv=fdatasyn: 这个选项和oflag=dsync含义一样。

(测试文件为1G)

(1)测试写速度(if=/dev/zero 不产生IO,测试结果为纯写速度)

dd if=/dev/zero of=/test/test bs=1024k count=1000

mark

测试结果:131 MB/s

(2)测试读速度(of=/dev/null 不产生IO,测试结果为纯读速度)

dd if=/tmp/test of=/dev/null bs=1024k

mark

测试结果:3.3 GB/s

(3)测试混合读写速度:

dd if=/tmp/test of=/var/test bs=1024k

mark

​​‌‌​​​‌‌​‌​​‌‌‍​‌​‌‌‌​​‌‌‌‌​‌​‍​‌​​‌​​​‌​​​‌‌​‍​‌​‌‌​​​‌‌​​​​​‍​​‌​‌‌‌‌‌‌‌‌​​​‍​‌‌​​‌‌‌​‌‌​​‌‌‌‍​‌‌​​​‌‌‌​​​‌​‌‍​​‌‌‌‌‌‌‌‌​​‌‌‍​​​​‌‌‌​​‌‌‌‌‌​‍​​​‌​​‌​​‌​​‌‌‌‍​​‌‌‌‌‌‌‌​‌‌​​​‍​‌‌‌‌‌‌‌​​​​​​‌​‍​​‌​​‌​‌​‌‌​‌​​‍​‌‌‌​‌​​​​‌​‌​‌​‍​‌​‌​‌‌‌​​​​​‌​‍​‌‌​​​‌​​​‌‌​‌‌‍​​​​​​​​‌‌‌​​‌​‌‍‌​​‌‌​​‌‍‌​​‌​‌‌​‍‌​​‌​​​​‍​‌​‌​‌‌​‌‌‌​​‌‌‍‌​​‌‌​‌‌‍‌​​‌‌​‌‌‍​​‌‌‌‌‌‌‌‌​​‌​‍​​​​​​​​‌‌‌‌​​‌‌‍​​​‌​‌​‌‌​​‌‌‌​‍‌​​‌‌‌‌​‍‌​​‌‌​‌‌‍‌​​‌​​‌​‍‌​​‌​‌‌​‍‌​​‌​​​‌‍​‌‌​​​‌​‌‌‌​​​‌‍‌‌​​‌‌​‌‍‌‌​​‌‌‌‌‍‌‌​​‌‌‌​‍‌‌​​​‌‌‌‍‌‌​‌​​‌​‍‌‌​​‌‌‌‌‍‌‌​​‌​‌‌‍‌‌​‌​​‌​‍‌‌​​‌‌‌​‍‌‌​​‌‌‌​‍​‌​‌‌​‌‌‌‌​​‌​​‍​‌‌​​​​‌​‌​​​‌‌‍​​​​​​​​‌‌‌‌​​‌‌‍​‌​‌‌​​​‌‌​​​​​‍​​‌‌​‌​​‌‌‌‌​​​‍​‌​‌​​​‌‌​​‌‌‌‌‍​‌​‌​​​‌​‌‌‌‌‌‌‍​​​​​​​​‌‌‌​​‌​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​​‌​‌‌‍‌​​​‌‌‌‌‍‌​​​‌‌​​‍‌‌​​​‌​‌‍‌​‌​​​‌‌‍‌​‌​​​‌‌‍‌​​‌​‌‌​‍‌​​‌​‌​​‍‌​​‌​‌‌​‍‌​​​‌​​​‍‌​​‌​‌‌​‍‌‌​‌​​​‌‍‌​​‌​​‌​‍‌​​‌‌​‌​‍‌​‌​​​‌‌‍‌​​‌‌‌‌​‍‌​​​‌‌​‌‍‌​​‌‌‌​​‍‌​​‌​‌‌‌‍‌​​‌​‌‌​‍‌​​​‌​​‌‍‌​​‌‌​‌​‍‌​​​‌‌​​‍‌​‌​​​‌‌‍‌‌​​‌​‌‌‍‌‌​​​‌‌​‍‌‌​‌​​​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​‌​​‌​‍‌​​‌​​‌‌

测试结果:665 MB/s

此次测试取用的样本文件大小分别为1G和10G,其结果如下:

mark

小结

磁盘IO实际性能测试受到多种因素的影响,得出的值可能不确定。但还是能够大体看出其IO性能。

THE END.