最近搞硬件测试比较多,简单总结下,也很久没更新51cto博客啦。

fio是一款专业测ssd的工具,安装这里我不介绍了,这里简单介绍下命令的使用和测试。


以一行命令为例:

fio -filename=/dev/nvme0n1 -direct=1 -iodepth  32 -iodepth_batch 1 -iodepth_batch_complete 16 -rw=randread -ioengine=libaio -bs=16k -size=400G -numjobs=1 -runtime=600 -group_reporting -time_based -ramp_time=60 -name=nvme0 >> nvme0-4k-randread.out
参数注解(可以自行查看man文档对比下):
filename: 
    为该测试用例设置生成的文件名,方便各个jobs共享
direct: 
    是否使用io缓存,相当于直接io或者裸io,文件内容直接写到磁盘设备上,不经过缓存
iodepth: 
    队列深度,在异步io模式模拟一次丢给系统处理的io请求数量,同步系统由于串行,一般小于1
iodepth_batch: 
    io队列请求丢过来后,攒积到这些请求后,立即提交,默认是iodepth的值
iodepth_batch_complete: 
    io请求过来后,能retrieve获得的最多请求数
ipdepth_low: 
    io请求达到这个水平线后,开始尝试去补充和获取请求,默认是iodepth的值
上面组合的设置意思是:
    一次模拟生成32个io请求,一次处理能接受16个请求,异步模式下,1个请求来了直接提交
rw: 
    模拟当前的读写模式,模式有randread,randwrite,randrw(可以指定rwmixread或者rwmixwrite来指定比例,默认50),read,write,rw
ioengine:
    说明job处理io请求的调度方式,一般测试使用libaio(Linux native asynchronous I/O)
bs:
    一次io的实际块大小
size:
    每个job的测试大小,到这里才会结束io请求测试
numjobs:
    同时并行运行的工作jobs数,相当于一个job克隆,具有相同workload(负载)
runtime:
    运行的时间(s)
group_reporting:
    当设置这个值的时候,会把所有的jobs一起统计汇总平均值等信息,否则会按照每个jobs分别统计
time_based:
    如果设置这个值,及时io大小到达size后还会结束的情况,仍然会继续模拟相同的负载,直至这个时间runtime结束
ramp_time:
    ramp本意是坡度,相当于预热,意思是跑每个job之前会跑多久的预热,预热时间不算进runtime
name:
    给job起这个名字而不是使用默认的名称

一般来说,测试ssd,我们关注:

小数据随机读写(4k),大io顺序读写(16k or 1m)

raid卡缓存设置wt(write through,直接写,不经过缓存)

关注ssd的iops,lat,bw的速度等,建议配合完整的图说明,从而更容易看出ssd在经过大量重写后的性能。关于ssd的具体原理相关性,在另一篇讨论。


说白了,fio是一个生产io需求让测试的磁盘设备消费的一个工具,fio支持两种出图方式,最近我打算试下,

gfio,需要开启防火墙

fio配合gnuplot

自带

fio数据导出脚本分析并保存到数据库或文件,配合其他出图工具


最后提醒下哈,fio有examples,大家可以参考下,fio 文件的形式 其实更方便一点 有时候。jobs最好低于6,iodepth低于32.