fio 结果画图:
首先使用fio命令进行测试,并收集每秒的IOPS等数据资料:
fio --name=test --filename=/dev/nvme0n1 --ioengine=libaio --direct=1 --rw=rw --bs=128k --runtime=300 --iodepth=128 --numjobs=1 --group_reporting --write_iops_log=xx.txt --log_avg_msec=1000 --time_based
#“–filename”: 指定要进行IO测试的文件或设备的名称。
#“–direct=1”: 启用直接IO,绕过操作系统的缓存。
#“–rw=rw”:以读/写混合样式运行测试。
#“–bs=128k”: 每个IO操作的块大小为128 KB。
#“–runtime=300”: 测试的总运行时间为300秒(5分钟)。
#“–iodepth=128”: 使用每个线程/作业的最大I/O深度为128。
#“–numjobs=1”: 使用单线程/作业运行测试。
#“–log_avg_msec=1000”: 指定在日志文件中记录平均值和标准差的时间间隔为1000毫秒(1秒)。
#“–time_based”: 启用时间模式,因此fio将尝试运行指定的秒数,无论是否已完成所有请求。
#“--group_reporting”:启用分组报告模式,收集所有线程的测试数据
#“--write_iops_log”:存储IOPS数据
#“--log_avg_msec=1000”:每一秒记录一次IOPS数据
在这样的情况下,测试结束后会生成一份xx.txt_iops.1.log的文件,里面的内容结构如下:
1000, 21543, 0, 0
1000, 21455, 1, 0
2000, 23251, 0, 0
2000, 22988, 1, 0
3000, 23200, 0, 0
3000, 23136, 1, 0
4000, 22670, 0, 0
4000, 22742, 1, 0
.....
对于这样结构的资料,我们再使用python脚本进行解析,准备工作:
#安装库文件
pip3 install matplotlib
库安装好以后,脚本如下:
import matplotlib.pyplot as plt
#打开xx.txt_iops.log,读取内容
with open('xx.txt_iops.1.log', 'r') as f:
lines = f.readlines()
# 抽出第三列为1的数据
x1 = []
for line in lines:
if line.split(",")[2] == " 1":
items = line.strip().split(',')
x1.append(int(items[1]))
# 抽出第三列为0的数据
x2 = []
for line in lines:
if line.split(",")[2] == " 0":
items = line.strip().split(',')
x2.append(int(items[1]))
# 绘制折线图
#修改折线的颜色 color=()
#例如 'red'、'blue'、'green'等),也可以将其设置为一个RGB元组(例如 (1, 0, 0) 表示红色、(0, 1, 0) 表示绿色、(0, 0, 1) 表示蓝色、(1, 1, 0) 表示黄色、(0.5,0.5,0.5)表示灰色等)
#marker='o',将数据标点
#linestyle='' ,每个数据点之间取消线段连接,这两个都设定,代表默认折线图变成点图
plt.plot(x1, label='Write IOPS',color='red',marker='o',linestyle='')
plt.plot(x2, label='Read IOPS',color=(0,1,0))
# 添加图例显示
plt.legend()
# 添加坐标轴标签
plt.xlabel('time')
plt.ylabel('iops')
# 添加标题
plt.title('R/W IOPS')
# 保存图形
plt.savefig("fio_test.png")
# 显示图形
plt.show()
效果图示如下: