linux FIO命令详解(一):磁盘IO测试工具 fio (并简要介绍iostat工具)

2023-10-28

FIO介绍

FIO是测试IOPS的非常好的工具,用来对磁盘进行压力测试和验证。磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写两大类。FIO是一个可以产生很多线程或进程并执行用户指定的特定类型I/O操作的工具,FIO的典型用途是编写和模拟的I/O负载匹配的作业文件。也就是说FIO 是一个多线程io生成工具,可以生成多种IO模式,用来测试磁盘设备的性能(也包含文件系统:如针对网络文件系统 NFS 的IO测试)。fio在github上的坐标:https://github.com/axboe/fio

FIO 工具常用参数:

参数说明:
filename=/dev/sdb1 测试文件名称,通常选择需要测试的盘的data目录。
direct=1 是否使用directIO,测试过程绕过OS自带的buffer,使测试磁盘的结果更真实。Linux读写的时候,内核维护了缓存,数据先写到缓存,后面再后台写到SSD。读的时候也优先读缓存里的数据。这样速度可以加快,但是一旦掉电缓存里的数据就没了。所以有一种模式叫做DirectIO,跳过缓存,直接读写SSD。 
rw=randwrite 测试随机写的I/O
rw=randrw 测试随机写和读的I/O
bs=16k 单次io的块文件大小为16k
bsrange=512-2048 同上,提定数据块的大小范围
size=5G 每个线程读写的数据量是5GB。
numjobs=1 每个job(任务)开1个线程,这里用了几,后面每个用-name指定的任务就开几个线程测试。所以最终线程数=任务数(几个name=jobx)* numjobs。 
name=job1:一个任务的名字,重复了也没关系。如果fio -name=job1 -name=job2,建立了两个任务,共享-name=job1之前的参数。-name之后的就是job2任务独有的参数。 
thread  使用pthread_create创建线程,另一种是fork创建进程。进程的开销比线程要大,一般都采用thread测试。 
runtime=1000 测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止。
ioengine=libaio 指定io引擎使用libaio方式。libaio:Linux本地异步I/O。请注意,Linux可能只支持具有非缓冲I/O的排队行为(设置为“direct=1”或“buffered=0”);rbd:通过librbd直接访问CEPH Rados 
iodepth=16 队列的深度为16.在异步模式下,CPU不能一直无限的发命令到SSD。比如SSD执行读写如果发生了卡顿,那有可能系统会一直不停的发命令,几千个,甚至几万个,这样一方面SSD扛不住,另一方面这么多命令会很占内存,系统也要挂掉了。这样,就带来一个参数叫做队列深度。
Block Devices(RBD),无需使用内核RBD驱动程序(rbd.ko)。该参数包含很多ioengine,如:libhdfs/rdma等
rwmixwrite=30 在混合读写的模式下,写占30%
group_reporting 关于显示结果的,汇总每个进程的信息。
此外
lockmem=1g 只使用1g内存进行测试。
zero_buffers 用0初始化系统buffer。
nrfiles=8 每个进程生成文件的数量。
磁盘读写常用测试点:
1. Read=100% Ramdon=100% rw=randread (100%随机读)
2. Read=100% Sequence=100% rw=read (100%顺序读)
3. Write=100% Sequence=100% rw=write (100%顺序写)
4. Write=100% Ramdon=100% rw=randwrite (100%随机写)
5. Read=70% Sequence=100% rw=rw, rwmixread=70, rwmixwrite=30
(70%顺序读,30%顺序写)
6. Read=70% Ramdon=100% rw=randrw, rwmixread=70, rwmixwrite=30
(70%随机读,30%随机写)

fio例子:

[root@docker sda]# fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=read -filename=/dev/sda -name="BS 4KB read test" -iodepth=16 -runtime=60
BS 4KB read test: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=16
fio-3.7
Starting 1 thread
Jobs: 1 (f=1): [R(1)][100.0%][r=89.3MiB/s,w=0KiB/s][r=22.9k,w=0 IOPS][eta 00m:00s]
BS 4KB read test: (groupid=0, jobs=1): err= 0: pid=18557: Thu Apr 11 13:08:11 2019
   read: IOPS=22.7k, BW=88.5MiB/s (92.8MB/s)(5313MiB/60001msec)
    slat (nsec): min=901, max=168330, avg=6932.34, stdev=1348.82
    clat (usec): min=90, max=63760, avg=698.08, stdev=240.83
     lat (usec): min=97, max=63762, avg=705.17, stdev=240.81
    clat percentiles (usec):
     |  1.00th=[  619],  5.00th=[  627], 10.00th=[  627], 20.00th=[  635],
     | 30.00th=[  635], 40.00th=[  685], 50.00th=[  717], 60.00th=[  725],
     | 70.00th=[  725], 80.00th=[  725], 90.00th=[  734], 95.00th=[  816],
     | 99.00th=[ 1004], 99.50th=[ 1020], 99.90th=[ 1057], 99.95th=[ 1057],
     | 99.99th=[ 1860]
   bw (  KiB/s): min=62144, max=91552, per=100.00%, avg=90669.02, stdev=3533.77, samples=120
   iops        : min=15536, max=22888, avg=22667.27, stdev=883.44, samples=120
  lat (usec)   : 100=0.01%, 250=0.01%, 500=0.01%, 750=93.85%, 1000=5.14%
  lat (msec)   : 2=0.99%, 4=0.01%, 10=0.01%, 50=0.01%, 100=0.01%
  cpu          : usr=5.35%, sys=23.17%, ctx=1359692, majf=0, minf=17
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=100.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.1%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=1360097,0,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=16

Run status group 0 (all jobs):
   READ: bw=88.5MiB/s (92.8MB/s), 88.5MiB/s-88.5MiB/s (92.8MB/s-92.8MB/s), io=5313MiB (5571MB), run=60001-60001msec

Disk stats (read/write):
  sda: ios=1357472/0, merge=70/0, ticks=949141/0, in_queue=948776, util=99.88%

io=执行了多少M的IO

bw=平均IO带宽
iops=IOPS
runt=线程运行时间
slat=提交延迟,提交该IO请求到kernel所花的时间(不包括kernel处理的时间)
clat=完成延迟, 提交该IO请求到kernel后,处理所花的时间
lat=响应时间
bw=带宽
cpu=利用率
IO depths=io队列
IO submit=单个IO提交要提交的IO数
IO complete=Like the above submit number, but for completions instead.
IO issued=The number of read/write requests issued, and how many of them were short.
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.
io_queue=花费在队列上的总共时间.
util=磁盘利用率

fio 有很多测试任务配置文件,在git工程 examples 文件夹中,我们可以使用命令行参数进行直接配置,也可以直接通过配置文件配置一次测试的内容。

更详细对fio输出说明请参考博文:Fio Output Explained 

IO状态监控:

进行磁盘测试的时候,我们可以使用iostat 等监控工具,查看所有磁盘当前的读写状态(fedora 系统上 sysstat-11.7.3-2.fc29.x86_64 收录了此工具)。

监控磁盘IO命令:iostat –mx 1

Iostat介绍

iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。

语法

iostat [ -c ] [ -d ] [ -h ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ] [ device [...] | ALL ] [ -p [ device [,...] | ALL ] ] [ interval [ count ] ]

iostat使用范例:

iostat -d -x -k 1 10
Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda          1.56  28.31  7.80 31.49   42.51    2.92    21.26     1.46     1.16     0.03    0.79   2.62  10.28
Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda          2.00  20.00 381.00  7.00 12320.00  216.00  6160.00   108.00    32.31     1.75    4.50   2.17  84.20

-d: 显示该设备的状态的参数;

-x:是一个比较常用的选项,该选项将用于显示和io相关的扩展数据。

-k:  静态显示每秒的统计(单位kilobytes )

1: 第一个数字表示每隔1秒刷新一次数据显示。

10:第二个数字表示总共的刷新次数

 

输出信息的含义

rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge);
wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。
r/s: 该设备的每秒完成的读请求数(merge合并之后的)
w/s:  该设备的每秒完成的写请求数(merge合并之后的)
rsec/s:每秒读取的扇区数;
wsec/:每秒写入的扇区数。
rKB/s:每秒发送给该设备的总读请求数 
wKB/s:每秒发送给该设备的总写请求数 
avgrq-sz 平均请求扇区的大小
avgqu-sz 是平均请求队列的长度。毫无疑问,队列长度越短越好。    
await:  每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
svctm:    表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢。
%util: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。

参考:

linux 磁盘IO测试工具:FIO (同时简要介绍dd工具测试)

Linux IO实时监控iostat命令详解

SSD测试第一神器——FIO

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux FIO命令详解(一):磁盘IO测试工具 fio (并简要介绍iostat工具) 的相关文章

随机推荐

  • Maven云笔记之登录注册

    Maven云笔记注册登录篇 使用MVC框架开始编写一个笔记本应用 目录结构 登录界面
  • 关于智能车独轮组编码器的思考

    独轮车模到货了 计划使用更优雅更便宜的霍尔编码器而不用常规的机械编码器 所以立刻对霍尔编码器可行性进行了评估 O车模减速电机出轴特写 减速电机大概就是加了减速齿轮组的RS380 是标准尺寸电机 所以配套的编码器市面上肯定有卖 淘宝稍稍一翻便
  • 前后端分离项目简单实现增删改查

    大家好 我是梦想皮皮 今天带来一篇关于springboot vue MySQL项目的粗浅的介绍 同时也用到了vue element也集成了mybatis希望能帮助到大家 该项目使用到springboot vue MySQL mybatis同
  • 如何读懂期权希腊字母、隐含波动率、理论价格等?

    如何读懂期权希腊字母 隐含波动率 理论价格等 每一个希腊值都是用来度量期权头寸的某种特定风险 投资者可以通过管理这些希腊值 以 便将风险保持在一个可以接受的范围之内 Delta 期权价格变化同标的价格变化之间的比率 看涨期权的 Delta
  • r连接db2 no license is present_R语言基础 期中考试

    一 单选题 题数 20 共 40 0 分 1下列用来转换数据框的函数是 2 0分 2 0 分A as listB as matrixC as data frameD as vector我的答案 C2以下函数不能直接查看plot函数的帮助文档
  • 检测CPU是否具备VT的功能,并开启

    1 cpuid 指令 EFLAGS寄存器中的ID标志 位21 表示对CPUID指令的支持 如果一个软件程序可以设置和清除这个标志 那么执行该程序的处理器支持CPUID指令 这条指令在非64位模式和64位模式下操作相同 CPUID在EAX E
  • 华为手机计算机代码大全,华为手机指令代码大全,你想要了解的功能都在这里!...

    原标题 华为手机指令代码大全 你想要了解的功能都在这里 昨天写了vivo手机的指令代码 有部分朋友说不够详细 以及不懂这些是干嘛的 其实 你按照文中去操作一遍就能知道这些指令的功能了啊 今天来说说华为 华为手机大部分手机都采用的是安卓系统
  • Vue.js 学习笔记十六:Axios 之 Axios 封装

    目录 Axios 封装 Axios 封装 src plugins http js import axios from axios import router from router import store from store impor
  • Unity在运行时使用FBX SDK的API

    1 写在前面 本文主要一块学习关于Unity官方封装的AutoDesk的FBX SDK的API的C 版本包 最初该包的本意是想让开发者在编辑器模式下使用 但是官方也提供了在运行时对于该包的支持 2 获取Autodesk FBX SDK fo
  • 竞赛 基于机器视觉的手势检测和识别算法

    0 前言 优质竞赛项目系列 今天要分享的是 基于深度学习的手势检测与识别算法 该项目较为新颖 适合作为竞赛课题方向 学长非常推荐 更多资料 项目分享 https gitee com dancheng senior postgraduate
  • LeetCode:228(Python)—— 汇总区间(简单)

    汇总区间 概述 给定一个无重复元素的有序整数数组 nums 返回恰好覆盖数组中所有数字的最小有序区间范围列表 也就是说 nums 的每个元素都恰好被某个区间范围所覆盖 并且不存在属于某个范围但不属于 nums 的数字 x 输入 nums 0
  • js逆向补环境示例代码1

    在官方文档 内置对象中的object下很多属性都可以用来检测环境 Object JavaScript MDN 拿Object getOwnPropertyDescriptor 来做示例笔记 在文档中它的说明 Object getOwnPro
  • matlab erf erfi,误差函数

    误差函数 在数学中 误差函数 也称之为高斯误差函数 是一个特殊函数 即不是初等函数 其在概率论 统计学以及偏微分方程中都有广泛的应用 它的定义如下 erf x 1 x x e t 2 d t 2 0 x e t 2 d t displays
  • 关于pthread_rwlock_t读写锁产生死锁的情况

    对于pthread rwlock t读写锁 一个线程持有着写锁 又去加 该锁的 读锁 可能会产生死锁 一个线程持有着 读或者写 锁 又去加 该锁的 写锁 可能会产生死锁 此时pthread rwlock rdlock和pthread rwl
  • 49黑马QT笔记之利用TCP传输文件

    49黑马QT笔记之利用TCP传输文件 前提 黑马视频的代码第二次不能传输的原因是因为 客户端在第一次传输完成后 isStart false 即第二次无法接收文件信息并打开文件 所以他会出现 write device not open 我们在
  • 使用 FeignClient 进行微服务交互(微服务接口互相调用)

    先写一个公共方法 public String getSettingValue String name Map
  • Ros小车应用篇(一)——Ros小车wifiQT上位机

    Ros小车多功能QT上位机 代码仓库 https github com zhuchen99899 RosCar tree master Ros car pid test 小车嵌入式控制可以查看我的博客 https blog csdn net
  • Win10 开机密码破解

    1 开机 当出现Windows图标时 就强制关机 重复2 3次 系统便会进入自动修复 2 高级设置 gt 疑难解答 gt 高级选项 gt 命令提示符 3 依次输入 cd c windows system32 ren sethc exe ab
  • 为什么用GIF做埋点?

    原因 防止跨域拦截 一般而言 打点域名都不是当前域名 所以所有的接口请求都会构成跨域 而跨域请求很容易出现由于配置不当被浏览器拦截并报错 这是不能接受的 但图片的 src 属性并不会跨域 并且同样可以发起请求 防止阻塞页面加载 影响用户体验
  • linux FIO命令详解(一):磁盘IO测试工具 fio (并简要介绍iostat工具)

    FIO介绍 FIO是测试IOPS的非常好的工具 用来对磁盘进行压力测试和验证 磁盘IO是检查磁盘性能的重要指标 可以按照负载情况分成照顺序读写 随机读写两大类 FIO是一个可以产生很多线程或进程并执行用户指定的特定类型I O操作的工具 FI