Fio测试与数据统计
Fio(Flexible I/O Tester)是一款专业的Linux存储性能测试工具,具有多线程支持、异步I/O测试、灵活参数配置等特点。安装需先解决依赖包,通过./configure、make、make install三步完成。测试时需设置关键参数如块大小(bs)、队列深度(iodepth)、并发任务数(numjobs)等,支持随机/顺序读写模式。文中提供了完整的测试脚本示例,包含8块SSD的
一、Fio简介
Fio(Flexible I/O Tester)是一个功能强大且灵活的I/O测试工具,广泛用于Linux系统中对存储设备和文件系统的性能进行测试与分析
-
多线程/多进程支持
支持并发执行多个I/O任务,可以模拟真实环境下的高并发场景。 -
支持同步与异步I/O
可以测试同步I/O(如read/write)和异步I/O(如Linux AIO)的性能差异。 -
灵活的工作负载定义
可以自定义块大小(block size)、队列深度(queue depth)、读写比例、顺序或随机访问模式等参数。 -
丰富的输出信息
提供包括吞吐量(BW)、IOPS、延迟(latency)、CPU使用率等在内的详细性能指标。 -
脚本化配置
支持通过配置文件来定义复杂的测试任务,便于复用和自动化测试。
二、软件下载与安装
1、"官方"下载地址:https://github.com/axboe/fio.git
2、附件下载
3、安装软件
第一步先安装两个依赖包:如果操作系统是Centos/RedHat 8.7 也可以安装附件中的两个依赖包(依赖包是7.9的,我8.7的操作系统安装了Fio也可以正常使用)
rpm -ivh 依赖包名称 --nodeps
第二步安装软件:cd 到Fio软件目录,运行:./configure 结束后再运行 make 结束后再运行 make install (有可能会有一些提示,可以忽略);最后 输入fio -v 显示出版本号,基本表示安装成功。
三、参数说明
示例:fio -filename=/dev/sdb -direct=1 -ioengine=libaio -bs=4k -size=5G -numjobs=50\ -iodepth=16 -runtime=60 -thread -rw=randread -group_reporting -name="sansung0_4kB_randread_test">sansung0_4kB_randread_test
参数 | 说明 |
-filename=/dev/sdb | 指定要测试的目标设备为 /dev/sdi(通常是一个裸盘设备),不需要分区,直接对设备进行I/O操作。 |
-direct=1 | 启用直接I/O模式,绕过系统缓存(page cache),确保测试的是真实磁盘性能。 |
-ioengine=libaio | 使用 Linux 的异步 I/O 引擎(libaio),适用于支持异步I/O的设备(如SSD、NVMe)。 |
-bs=4k 或 --blocksize=4k | 设置每次I/O操作的数据块大小为 4KB,这是数据库等应用常见的I/O大小。 |
-size=5G | 每个线程/任务将访问的文件或设备大小为 5GB。在裸设备上,这意味着每个线程会访问不同的5GB区域。 |
-numjobs=50 | 启动 50 个并发线程(jobs)来执行测试,模拟高并发场景。 |
-iodepth=16 | 设置每个线程的队列深度为 16,表示每个线程最多可同时提交 16 个 I/O 请求(用于异步I/O)。 |
-runtime=60 | 测试运行时间为 60 秒,结束后自动停止。即使未完成指定数据量也会终止。 |
-thread | 使用线程而不是进程来创建多个 job(任务),适用于多核CPU环境。 |
-rw=randread | 设置I/O模式为 随机读取,常用于评估存储设备在随机访问下的性能。 |
-group_reporting | 所有线程的结果汇总成一个整体报告输出,而不是单独显示每个线程的性能。 |
-name="sansung0_4kB_randread_test" | 给本次测试命名,方便识别结果和日志。 |
> sansung0_4kB_randread_test | 将命令行输出重定向到一个名为 sansung0_4kB_randread_test 的文件中,保存测试结果。 |
备注:
- 如上示例: -size参数和-runtime参数,在实际测试中以-runtime参数为"先",即即使-size=5G,已经完成了,但是-runtime=60 时间没到60秒,测试还是会继续直至60秒。
- 如果测试的硬盘没有达到预期效果,可以考虑增加"压力",即提高numjobs和iodepth值。
- 测试过程中,可以通过dmesg以及iostat -dm 1 实时观察"测试状态"。
- 在运行fio脚本之前,建议先lsblk 看一下"硬盘盘符",以免出现把系统盘fio了。
四、脚本说明
1、Fio脚本(见参数说明);下图是sdb的fio脚本。
fio -filename=/dev/sdb -direct=1 -ioengine=libaio -bs=4k -size=50G -numjobs=50\
-iodepth=64 -runtime=60 -thread -rw=randread -group_reporting -name="sansung0_4kB_randread_test">sansung0_4kB_randread_test
mkfs.ext4 -F /dev/sdb
sleep 10
fio -filename=/dev/sdb -direct=1 -ioengine=libaio -bs=4k -size=50G -numjobs=50\
-iodepth=64 -runtime=60 -thread -rw=randwrite -group_reporting -name="sansung0_4kB_randwrite_test">sansung0_4kB_randwrite_test
mkfs.ext4 -F /dev/sdb
sleep 10
fio -filename=/dev/sdb -direct=1 -ioengine=libaio -bs=4k -size=50G -numjobs=50\
-iodepth=64 -runtime=60 -thread -rw=read -group_reporting -name="sansung0_4kB_read_test">sansung0_4kB_read_test
mkfs.ext4 -F /dev/sdb
sleep 10
fio -filename=/dev/sdb -direct=1 -ioengine=libaio -bs=4k -size=50G -numjobs=50\
-iodepth=64 -runtime=60 -thread -rw=write -group_reporting -name="sansung0_4kB_write_test">sansung0_4kB_write_test
mkfs.ext4 -F /dev/sdb
sleep 10
fio -filename=/dev/sdb -direct=1 -ioengine=libaio -bs=4k -size=50G -numjobs=50\
-iodepth=64 -runtime=60 -thread -rw=randrw -group_reporting -name="sansung0_4kB_randreadwrite_test">sansung0_4kB_randreadwrite_test
mkfs.ext4 -F /dev/sdb
sleep 10
fio -filename=/dev/sdb -direct=1 -ioengine=libaio -bs=4k -size=50G -numjobs=50\
-iodepth=64 -runtime=60 -thread -rw=rw -group_reporting -name="sansung0_4kB_readwrite_test">sansung0_4kB_readwrite_test
mkfs.ext4 -F /dev/sdb
sleep 10
fio -filename=/dev/sdb -direct=1 -ioengine=libaio -bs=1m -size=50G -numjobs=50\
-iodepth=64 -runtime=60 -thread -rw=randread -group_reporting -name="sansung0_1mB_randread_test">sansung0_1mB_randread_test
mkfs.ext4 -F /dev/sdb
sleep 10
fio -filename=/dev/sdb -direct=1 -ioengine=libaio -bs=1m -size=50G -numjobs=50\
-iodepth=64 -runtime=60 -thread -rw=read -group_reporting -name="sansung0_1mB_read_test">sansung0_1mB_read_test
mkfs.ext4 -F /dev/sdb
sleep 10
fio -filename=/dev/sdb -direct=1 -ioengine=libaio -bs=1m -size=50G -numjobs=50\
-iodepth=64 -runtime=60 -thread -rw=randwrite -group_reporting -name="sansung0_1mB_randwrite_test">sansung0_1mB_randwrite_test
mkfs.ext4 -F /dev/sdb
sleep 10
fio -filename=/dev/sdb -direct=1 -ioengine=libaio -bs=1m -size=50G -numjobs=50\
-iodepth=64 -runtime=60 -thread -rw=write -group_reporting -name="sansung0_1mB_write_test">sansung0_1mB_write_test
mkfs.ext4 -F /dev/sdb
sleep 10
fio -filename=/dev/sdb -direct=1 -ioengine=libaio -bs=1m -size=50G -numjobs=50\
-iodepth=64 -runtime=60 -thread -rw=randrw -group_reporting -name="sansung0_1mB_randreadwrite_test">sansung0_1mB_randreadwrite_test
mkfs.ext4 -F /dev/sdb
sleep 10
fio -filename=/dev/sdb -direct=1 -ioengine=libaio -bs=1m -size=50G -numjobs=50\
-iodepth=64 -runtime=60 -thread -rw=rw -group_reporting -name="sansung0_1mB_readwrite_test">sansung0_1mB_readwrite_test
mkfs.ext4 -F /dev/sdb
sleep 10
2、8块SSD同时运行fio,为了提高测试数据的准确性,建议测试前格式化硬盘。
#!/bin/bash
mkfs.ext4 -F /dev/sdb
sleep 10
mkfs.ext4 -F /dev/sdc
sleep 10
mkfs.ext4 -F /dev/sdd
sleep 10
mkfs.ext4 -F /dev/sde
sleep 10
mkfs.ext4 -F /dev/sdf
sleep 10
mkfs.ext4 -F /dev/sdg
sleep 10
mkfs.ext4 -F /dev/sdh
sleep 10
mkfs.ext4 -F /dev/sdi
sleep 10
gnome-terminal --geometry=80*25+10+10 -t "sdb0" -x bash -c "./fio_disk_test0;exec bash;"
gnome-terminal --geometry=80*25+10+10 -t "sdc0" -x bash -c "./fio_disk_test1;exec bash;"
gnome-terminal --geometry=80*25+10+10 -t "sdd0" -x bash -c "./fio_disk_test2;exec bash;"
gnome-terminal --geometry=80*25+10+10 -t "sde0" -x bash -c "./fio_disk_test3;exec bash;"
gnome-terminal --geometry=80*25+10+10 -t "sdf0" -x bash -c "./fio_disk_test4;exec bash;"
gnome-terminal --geometry=80*25+10+10 -t "sdg0" -x bash -c "./fio_disk_test5;exec bash;"
gnome-terminal --geometry=80*25+10+10 -t "sdh0" -x bash -c "./fio_disk_test6;exec bash;"
gnome-terminal --geometry=80*25+10+10 -t "sdi0" -x bash -c "./fio_disk_test7;exec bash;"
echo "Starting test all disks......"
sleep 10
exit
五、测试数据统计
本次数据统计是8块SSD同时运行fio脚本,并且每块SSD需要测试1M和4K的随机读、随机写、随机读写、顺序读、顺序写、顺读写;每块SSD需要统计IOPS和BW数据共32组*8=256组。如下图单块SSD统计表:
SSD_1 | |||
IOPS | BW(MiB/s) | ||
1MB_randread_test(随机读) | read | ||
1MB_randreadwrite_test(随机读写) | read | ||
write | |||
1MB_randwrite_test(随机写) | write | ||
1MB_read_test(顺序读) | read | ||
1MB_readwrite_test(顺序读写) | read | ||
write | |||
1MB_write_test(顺序写) | write | ||
4kB_randread_test(随机读) | read | ||
4kB_randreadwrite_test(随机读写) | read | ||
write | |||
4kB_randwrite_test(随机写) | write | ||
4kB_read_test(顺序读) | read | ||
4kB_readwrite_test(顺序读写) | read | ||
write | |||
4kB_write_test(顺序写) | write |
六、统计脚本
#!/bin/bash
##sansung0····7 是fio脚本中 -name="····"的。
grep IOPS sansung0* > 0.txt
grep IOPS sansung1* > 1.txt
grep IOPS sansung2* > 2.txt
grep IOPS sansung3* > 3.txt
grep IOPS sansung4* > 4.txt
grep IOPS sansung5* > 5.txt
grep IOPS sansung6* > 6.txt
grep IOPS sansung7* > 7.txt
awk '{print $3}' 0.txt|sed 's/IOPS=//g'|sed 's/,//g' > IOPS_0.txt
awk '{print $3}' 1.txt|sed 's/IOPS=//g'|sed 's/,//g' > IOPS_1.txt
awk '{print $3}' 2.txt|sed 's/IOPS=//g'|sed 's/,//g' > IOPS_2.txt
awk '{print $3}' 3.txt|sed 's/IOPS=//g'|sed 's/,//g' > IOPS_3.txt
awk '{print $3}' 4.txt|sed 's/IOPS=//g'|sed 's/,//g' > IOPS_4.txt
awk '{print $3}' 5.txt|sed 's/IOPS=//g'|sed 's/,//g' > IOPS_5.txt
awk '{print $3}' 6.txt|sed 's/IOPS=//g'|sed 's/,//g' > IOPS_6.txt
awk '{print $3}' 7.txt|sed 's/IOPS=//g'|sed 's/,//g' > IOPS_7.txt
awk '{print $4}' 0.txt|sed 's/BW=//g'|sed 's/MiB\/s//g' > BW_0.txt
awk '{print $4}' 1.txt|sed 's/BW=//g'|sed 's/MiB\/s//g' > BW_1.txt
awk '{print $4}' 2.txt|sed 's/BW=//g'|sed 's/MiB\/s//g' > BW_2.txt
awk '{print $4}' 3.txt|sed 's/BW=//g'|sed 's/MiB\/s//g' > BW_3.txt
awk '{print $4}' 4.txt|sed 's/BW=//g'|sed 's/MiB\/s//g' > BW_4.txt
awk '{print $4}' 5.txt|sed 's/BW=//g'|sed 's/MiB\/s//g' > BW_5.txt
awk '{print $4}' 6.txt|sed 's/BW=//g'|sed 's/MiB\/s//g' > BW_6.txt
awk '{print $4}' 7.txt|sed 's/BW=//g'|sed 's/MiB\/s//g' > BW_7.txt
paste -d ' ' IOPS_0.txt BW_0.txt IOPS_1.txt BW_1.txt IOPS_2.txt BW_2.txt IOPS_3.txt BW_3.txt IOPS_4.txt BW_4.txt IOPS_5.txt BW_5.txt IOPS_6.txt BW_6.txt IOPS_7.txt BW_7.txt > data.txt
最终带到的测试数据文件是data.txt,如下图:
190 191 190 191 190 190 188 188 187 188 188 188 187 188 188 188
148 148 151 152 148 149 150 150 149 150 147 147 150 150 149 149
144 145 148 149 146 146 147 148 147 147 144 144 147 147 146 146
191 191 196 197 190 191 188 188 192 192 186 186 188 188 188 188
190 190 190 191 190 190 188 188 188 188 188 189 188 188 188 188
150 151 155 155 151 152 152 153 152 152 149 150 150 150 152 153
147 148 152 152 148 148 150 150 149 149 146 146 147 147 149 149
194 195 201 201 195 195 194 194 194 194 189 190 195 195 194 194
19.9k 77.9 19.8k 77.5 19.8k 77.3 19.8k 77.2 19.7k 77.1 19.7k 77.1 19.8k 77.2 19.8k 77.3
9746 38.1 9718 37.0 9677 37.8 9634 37.6 9606 37.5 9586 37.4 9603 37.5 9635 37.6
9775 38.2 9747 38.1 9705 37.9 9660 37.7 9633 37.6 9614 37.6 9629 37.6 9661 37.7
32.8k 128 18.5k 72.2 18.3k 71.7 18.3k 71.4 18.2k 71.1 18.2k 70.0 18.2k 71.1 18.1k 70.8
138k 538 54.2k 212 53.9k 211 53.6k 209 54.0k 211 53.6k 209 53.6k 209 53.5k 209
33.4k 130 33.2k 130 33.2k 130 33.2k 130 33.1k 129 33.1k 129 33.2k 130 33.1k 129
33.3k 130 33.2k 130 33.2k 130 33.2k 130 33.1k 129 33.1k 129 33.1k 129 33.1k 129
44.2k 173 44.2k 172 44.1k 172 43.0k 172 43.9k 171 43.9k 171 43.0k 172 44.1k 172
打开数据统计表(见附件),直接复制的结果是1列16行,需要进行数据导入,如下图:
然后把下图数据复制到数据统计表中即可。

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)