简介

Fio 是一个 I/O 工具,用来对硬件进行压力测试和验证,磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写两大类。

Fio支持13种不同的I/O引擎,包括:sync, mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio , I/O priorities (for newer Linux kernels), rate I/O, forked or threaded jobs, 等等。

fio-2.1.10百度网盘下载链接:
链接:https://pan.baidu.com/s/1d_ho1Q1uN_0Kaq3N01OLWw?pwd=4z4r
提取码:4z4r

本文以银河麒麟操作系统为例。

测试方法

1.安装libaio:(注意:顺序不能反,一定要先安装libaio,再编译)
桌面版本:

  1. apt-get -y install libaio1 libaio-dev
  2.  
    • 1

服务器版本:

  1. yum install libaio libaio-devel
  2.  
    • 1

2.解压fio工具包,执行命令:

  1. tar xvf fio-2.1.10-fix.tar.gz
  2.  
    • 1

3.解压后进入目录

  1. cd fio-2.1.10
  2.  
    • 1

4.对应架构,编译

  1. ./configure
  2. make && make install
  3.  
    • 1
    • 2

5.执行测试命令(示例)

  1. fio -filename=/data/test -direct=1 -iodepth 32 -thread -rw=read -ioengine=libaio -bs=4k -size=5G -numjobs=8 -group_reporting -runtime=120 -time_base -name=/home/fio.result >> /home/fio.result
  2.  
    • 1

6.第5步执行完后,更改-rw的参数分别为:write、randwrite、randread;跑完后再更改-bs=参数为1M;-rw=参数分别为read、write、randwrite、randread再跑一遍;
共测试8组,对比测试数据。

7.测试完成后可查看/home/fio.result文件看结果:

  1. cat /home/fio.result
  2.  
    • 1

参数说明

1.filename=/data/test 测试文件名称,通常选择需要测试的盘的data目录;
2. direct=1 是否使用directIO,测试过程绕过OS自带的buffer。Linux读写的时候,内核维护了缓存,数据先写到缓存,后面再后台写到SSD。读的时候也优先读缓存里的数据。这样速度可以加快,但是一旦掉电缓存里的数据就没了。所以有一种模式叫做directIO,跳过缓存,直接读写SSD,使测试结果更真实;
3. rw=read 测试顺序读的I/O;
4. rw=write 测试顺序写的I/O;
5. rw=randread 测试随机读的I/O;
6. rw=write rw=randwrite 测试随机写的I/O;
7. rw=write rw=randrw 测试随机混合读和写的I/O;
8. bs=4k 单次io的块文件大小为4k;
9. size=5G 本次的测试文件大小为5g,以每次4k的io进行测试;
10. numjobs=8 测试线程为8;(需要根据测试的cpu线程数做对应修改)
11. name=job1 一个任务的名字,重复了也没关系;
12. thread 使用pthread_create创建线程,另一种是fork创建进程。进程的开销比线程要大,一般都采用thread测试;
13. group_reporting 关于显示结果的,汇总每个进程的信息;
14. runtime=120 测试时间为120秒,如果不写则一直将5g文件分4k每次写完为止;
15. time_based 如果设置的话,即使file已被完全读写或写完,也要执行完runtime规定的时间,它是通过循环执行相同的负载来实现的;
16. ioengine=libaio 指定io引擎使用libaio方式。
libaio:Linux本地异步I/O。请注意,Linux可能只支持具有非缓冲I/O的排队行为(设置为“direct=1”或“buffered=0”);
17. iodepth=32 队列的深度为32。
  同步的IO:一次只能发出一个IO请求,等待内核完成才返回,这样对于单个线程iodepth总是小于1。(电梯算法:假如一部电梯一次只能搭乘一人,那么每个人一但乘上电梯,就能快速达到目的地(响应时间),但需要耗费较长的等待时间(队列长度)。虽然响应时间较短,但系统的吞吐量很小。)
  异步情况下:一次提交一批,然后等待一批的完成,减少交互的次数,会更有效率。加大磁盘队列深度就是让磁盘不断工作,减少磁盘的空闲时间。(电梯算法:32个人等电梯,一次上满32人,只需等一次电梯即可)。

Linux系统查看默认队列深度方法
lsscis系统默认是未安装的,需要安装一下

  1. apt-get install lsscis
  2.  
    • 1

然后执行:lsscsi -l

  1. lsscsi -l
  2.  
    • 1
  1. [0:0:0:0] disk DGC VRAID 0533 /dev/sda
  2. state=running queue_depth=31 scsi_level=5 type=0 device_blocked=0 timeout=30
  3.  
    • 1
    • 2

可看到,该队列深度为31。

测试结果分析

当fio完成的时候(或是通过ctrl-c终止的时候),将会打印每一个线程的数据,每个group的数据,和磁盘数据。
本次顺序读测试结果如下图所示:

各项参数说明
io 执行了多少M的IO
bw 平均IO带宽
iops IOPS 即I/O per second,即每秒进行读写(I/O)操作的次数,是衡量磁盘性能的主要指标之一。
runt 线程运行时间(单位毫秒)
slat 提交延迟
clat 完成延迟
lat 响应时间
cpu 利用率
IO depths io队列
IO submit 单个IO提交要提交的IO数
IO complete 与上面的提交编号一样,但改为填写
IO issued 发出的读/写请求数,以及短请求数。
IO latencies IO延迟的分布
下面的io 总共执行了多少size的IO
aggrb group总带宽
minb 最小平均带宽.
maxb 最大平均带宽.
mint group中线程的最短运行时间.
maxt group中线程的最长运行时间.
ios 所有group总共执行的IO数.
merge 总共发生的IO合并数.
ticks Number of ticks we kept the disk busy.
in_queue 花费在队列上的总共时间.
util 磁盘利用率

总结

我们一般主要看iops、bw、util的值,数值越高则性能越好。也可参考硬盘厂商提供的理论值,我们的测试数据达到厂商提供的数据90%以上,则测试结果较好。

文章知识点与官方知识档案匹配,可进一步学习相关知识
CS入门技能树Linux入门初识Linux29394 人正在系统学习中

[转帖]文件系统读写性能fio测试方法及参数详解的更多相关文章

  1. [转帖]XCopy复制文件夹命令及参数详解以及xcopy拷贝目录并排除特定文件

    XCopy复制文件夹命令及参数详解以及xcopy拷贝目录并排除特定文件 https://www.cnblogs.com/smartsmile/p/7665979.html xcopy dirA dir ...

  2. (转)MySQL性能调优my.cnf详解

    MySQL性能调优my.cnf详解 https://blog.linuxeye.cn/379.html http://blog.csdn.net/orichisonic/article/details ...

  3. Java性能分析之线程栈详解与性能分析

    Java性能分析之线程栈详解 Java性能分析迈不过去的一个关键点是线程栈,新的性能班级也讲到了JVM这一块,所以本篇文章对线程栈进行基础知识普及以及如何对线程栈进行性能分析. 基本概念 线程堆栈也称 ...

  4. Java生产环境下性能监控与调优详解视频教程 百度云 网盘

    集数合计:9章Java视频教程详情描述:A0193<Java生产环境下性能监控与调优详解视频教程>软件开发只是第一步,上线后的性能监控与调优才是更为重要的一步本课程将为你讲解如何在生产环境 ...

  5. 【转帖】从原理到应用,Elasticsearch详解

    从原理到应用,Elasticsearch详解 https://segmentfault.com/a/1190000020022504 elasticsearch 2.1k 次阅读  ·  读完需要 4 ...

  6. mysql服务性能优化—my.cnf配置说明详解

    MYSQL服务器my.cnf配置文档详解硬件:内存16G [client]port = 3306socket = /data/3306/mysql.sock [mysql]no-auto-rehash ...

  7. [转帖]技术盛宴 | 关于PoE以太网供电技术详解

    技术盛宴 | 关于PoE以太网供电技术详解 https://smb.pconline.com.cn/1208/12085824.html   [PConline 干货铺]随着物联网技术飞速发展,需要提 ...

  8. [转帖]ASP.NET Core 中间件(Middleware)详解

    ASP.NET Core 中间件(Middleware)详解   本文为官方文档译文,官方文档现已非机器翻译 https://docs.microsoft.com/zh-cn/aspnet/core/ ...

  9. MySQL性能调优my.cnf详解

    [client] port = 3306 socket = /tmp/mysql.sock [mysqld] port = 3306 socket = /tmp/mysql.sock basedir  ...

  10. MySQL5.6版本性能调优my.cnf详解

    [client] port = 3306 socket = /tmp/mysql.sock [mysqld] port = 3306 socket = /tmp/mysql.sock basedir  ...

随机推荐

  1. Langchain-Chatchat项目:3-Langchain计算器工具Agent思路和实现

      本文主要讨论Langchain-Chatchat项目中自定义Agent问答的思路和实现.以"计算器工具"为例,简单理解就是通过LLM识别应该使用的工具类型,然后交给相应的工具( ...

  2. mac phpbrew安装

    php 编译安装php 7.2.26 aliyun 镜像中心:https://developer.aliyun.com/mirror/ 1.安装brew /usr/bin/ruby -e " ...

  3. 问鼎CodeXGLUE榜单,华为云UniXcoder-VESO-v1算法取得突破

    摘要:华为云PaaS技术创新团队基于UniXcoder模型,在公开测试数据集(CodeXGLUE)上的代码搜索任务评测结果上取得突破,在CodeXGLUE榜单上排名中第一. 本文分享自华为云社区< ...

  4. Gzip之后继者Brotli浅析之CDN厂商的智能压缩,服务器Brotli设置

    "智能压缩"按照又拍云的说法是,同时支持 Gzip 和 Brotli 压缩算法.根据用于浏览器开启自动选择不同压缩方式. Gzip 压缩算法 Gzip 基于 DEFLATE 算法, ...

  5. 📝 App备案与iOS云管理式证书 ,公钥及证书SHA-1指纹的获取方法

    ​ 引言 在iOS应用程序开发过程中,进行App备案并获取公钥及证书SHA-1指纹是至关重要的步骤.本文将介绍如何通过appuploader工具获取iOS云管理式证书 Distribution Man ...

  6. IIS 设置超时时间

    高级设置 => 限制 => 连接超时(秒),默认120秒,根据实际情况调整

  7. Spring事务传播机制解析

    确保数据一致性的关键 在Java的Spring框架中,事务管理是保证应用数据一致性和可靠性的关键.Spring提供了灵活的事务传播机制,它定义了事务边界,以及在嵌套方法调用时如何处理事务.本文旨在深入 ...

  8. Python 基于深度学习的 opencv 车牌识别系统,可以准确识别车牌号

    大家好,我是程序员徐师兄,6 年大厂程序员经验,点击关注我 简介 毕业设计基于Opencv的车牌识别系统 车牌搜索识别找出某个车牌号 对比识别车牌系统 车牌数据库认证系统 车牌图文搜索系统 车牌数据库 ...

  9. 它来了!真正的 python 多线程

    哈喽大家好,我是咸鱼 几天前,IBM 工程师 Martin Heinz 发文表示 python 3.12 版本回引入"Per-Interpreter GIL",有了这个 Per-I ...

  10. kafka集群七、java操作kafka(有密码验证)

    系列导航 一.kafka搭建-单机版 二.kafka搭建-集群搭建 三.kafka集群增加密码验证 四.kafka集群权限增加ACL 五.kafka集群__consumer_offsets副本数修改 ...