Fio压测工具操作

fio -name=iouring_test -filename=/mnt/vdd/testfile -iodepth=128 -thread -rw=randread -ioengine=io_uring -sqthread_poll=1 -direct=1 -bs=4k -size=10G -numjobs=1 -runtime=120 -group_reporting

常用参数

[time]

runtime=time

  • 告诉fio在指定的时间段后终止处理。很难确定指定作业将运行多长时间,因此此参数可以方便的将总运行时间限制为给定时间。当省略单位时间,该数值以秒为单位进行解释。

time_based

  • 如果设置,即使文件被完全读取或写入,fio也将在指定的运行期间运行。它会在runtime准许时间内多次循环相同的工作负载。

[I/O tpye]

direct=bool

​ 是否使用 direct io,测试过程不使用OS 自带的buffer,使测试磁盘的结果更真实。Linux读写的时候,内核维护了缓存,数据先写到缓存,后面在后台写到SSD。读的时候也优先读缓存里的数据。这样速度可以加快,但是一旦掉电,缓存里的数据就没有了。所以有一种模式叫做direct io,跳过缓存,直接读写SSD。

rw=randwrite

测试随机写的I/O:

​ 顺序IO是指读写操作的访问地址顺序连接,顺序的操作磁道搜索时间显著减少,因为磁头可以以最小的移动访问下一块。【数据备份和日志记录都是顺序IO业务】

​ 随机IO是指读写操作时间连续,但是访问地址不连续,随机分布在磁盘的地址空间中。产生随机IO的业务有OLTP服务,SQL等。

rw=randrw

​ 测试随机写或者读的IO

rwmixwrite=int

​ 在混合读写模式下,写占用30%

[Blocks size]

bs=int

​ 单次IO的块文件大小为16k

bsrange=1k-4k,2k-8k,1k-4k

​ 指定数据块的大小范围,可以为读取、写入和修剪指定逗号分割的范围。

size=5G

​ 每个线程读写的数据量是5GB

[Job description]

name=str

​ 一个任务的名字,重复了也没关系。如果fio -name=job1 -name=job2,建立了两个任务,共享-name=job1之前的参数。-name=job1之后的就是job2任务独有的参数。

numjobs=int

​ 创建此作业的指定数量的克隆。每个作业克隆都作为一个独立的线程或者进程产生(执行相同工作的进程或者线程)。每个Job(任务)开1个线程,有多少 -name 就开多少个线程。所以最终线程数 = 任务数 (-name 的数量) * numjiobs。

filename=str

​ 测试文件的名称。指定相对路径或者绝对路径。没有的话会自行创建。

[Threads, processes and job synchronization]

thread

​ Fio默认使用fork创建作业,如果给出此选项,将会以pthread_create(3) 创建作业。使用fork创建线程的开销比较大。

threads=int

​ 指定线程的数量

[I/O engine]

ioengine=<str>

​ str: sync 基本的同步·读写操作,参考fsync和fdatasync

​ str:psync 基于 pread(2) 或者 pwrite(2) 进行IO操作。

​ str:vsync

​ str:pvsync

​ str:pvsync2:

​ str:io_uring 快速的Linux原生异步I/O。支持直接和缓冲IO操作。

​ str:io_uring_cmd 用于传递命令的快速Linux本机异步I/O。

​ str:libaio linux异步I/O。注意:Linux可能只支持具有非缓冲I/O的排队行为(设置为direct=1或buffered=0: rbd:通过librbd直接访问CEPH Rados

userspace_reap:[libaio]

​ 通常,在使用libaio引擎的情况下,fio将使用io_getevents(2)系统调用来获取新返回的事件。打开此标志后,将直接从客户空间读取AIO环以获取事件。提高异步IO的收割速度。当轮询至少0个事件时候,收割模式才会启动。(iodepth_batch_complete=0

[IO depth]

iodepth=int

​ 队列的深度。在异步模式下,CPU不能一直无限的发命令到SSD。比如SSD执行读写如果发生了卡顿,那有可能系统会一直不停的发命令,几千个,甚至几万个,这样一方面SSD扛不住,另一方面这么多命令会很占内存,系统也要挂掉了。

iodepth 技巧

大致把延迟分为两部分,第一部分是读写本身需要的时间ts,第二部分是路上的网络、上下文切换时间tl。

iodepth可降低tl占比,提高ts占比:

iodepth可以批量提交请求,所以可以降低上下文切换的次数。

当ts本身占比很高的时候,那就没有提升的空间了。

如果ts占比较低,通过提高iodepth就可以提升iops。

[Buffers and memory]

lockmem=int

​ 使用mlock(2)固定指定数量的内存。可用于模拟较小的内存量。只使用指定内存进行测试。

zero_buffers

​ 用全零初始化缓冲区。默认值:用随机数据填充缓冲区。

[Target file/device]

nrfiles=int

​ 用于此作业文件数。默认为1.除非文件大小明确指定大小,否则文件大小将是数据量除以nrfiles的大小。文件是为每个线程单独创建的。默认情况下,每个文件的名称中都有一个文件编号。

opendir=str

​ 让fio递归的添加目录下和子目录下的所有文件。

[command line options]

--output=filename

​ 输出日志信息到指定的文件。

--output-format=format

​ 指定输出文件的格式。将日志格式设置为normal、terse、json 或 json+。可以选择多种格式,以逗号分隔。terse 是一种基于 CSV 的格式。json+ 类似于 json,只是它添加了延迟存储桶的完整转储。

[Measurements and reporting]

group_reporting

​ 关于显示结果的,汇总每个进程的信息。

stats=bool

​ 默认情况下,fio收集并显示所有运行的作业的最终输出结果。如果此选项设置为0,则fio将在最终统计输出中忽略它。

write_bw_log=str

​ 如果给定,为此作业编写带宽日志。可以用于存储作业在其生命周期内的宽带数据。

write_lat_log=str

​ 与write_bw_log相同,只是此选项创建 I/O 提交(例如,name_slat.x.log)、完成(例如,name_clat.x.log)和总(例如,name_lat.x.log)延迟文件。有关文件名格式的详细信息,请参阅write_bw_log,并了解数据在文件中的结构,请参阅日志文件格式。

write_hist_log=str

​ 与write_bw_log相同,但改为写入I/O完成延迟直方图(例如 name_hist.x.log)。

fio压测示例

#针对io_uring的fixedufs特性
fio -threads=8 -size=10G -name=test -group_reporting -filename=./io.tmp -runtime=60 --ioengine=io_uring --iodepth=512 --fixedbufs #针对io_uring的sqthread_poll特性
fio -threads=8 -size=10G -name=test -group_reporting -filename=./io.tmp -runtime=60 --ioengine=io_uring --iodepth=512 --sqthread_poll 1

日志数据说明

[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%

Fio工具详解【强大的IO性能压测工具】的更多相关文章

  1. MySQL 性能压测工具-sysbench,从入门到自定义测试项

    sysbench是一个开源的.基于LuaJIT(LuaJIT 是 Lua 的即时编译器,可将代码直接翻译成机器码,性能比原生 lua 要高) 的.可自定义脚本的多线程基准测试工具,也是目前用得最多的 ...

  2. [SCF+wetest+jmeter]简单云性能压测工具使用方案

    前言 压测太难?局域网压力无法判断服务器网络指标?无法产生非常大的并发量?云性能太贵? 也许我们可以把各种简单的工具拼起来进行压力测试! 准备 https://cloud.tencent.com/pr ...

  3. linux性能压测工具

    http://benjr.tw/532 http://blog.yufeng.info/archives/2023 https://www.cnblogs.com/zhoujinyi/archive/ ...

  4. 018 磁盘 IO 性能监控/压测工具(sar、iotop、fio、iostat)

    1 sar 命令查看当前磁盘 IO 读写 sar(System Activity Reporter 系统活动情况报告)是 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告 ...

  5. valgrind和Kcachegrind性能分析工具详解

    一.valgrind介绍 valgrind是运行在Linux上的一套基于仿真技术的程序调试和分析工具,用于构建动态分析工具的装备性框架.它包括一个工具集,每个工具执行某种类型的调试.分析或类似的任务, ...

  6. oracle tkprof 工具详解

    oracle  tkprof 工具详解 今天是2013-09-26,进行tkprof工具使用学习,在此记录一下笔记: 一)查看需要跟踪会话信息: select s.sid,s.serial#,s.us ...

  7. 并发模式与 RPS 模式之争,性能压测领域的星球大战

    本文是<如何做好性能压测>系列专题分享的第四期,该专题将从性能压测的设计.实现.执行.监控.问题定位和分析.应用场景等多个纬度对性能压测的全过程进行拆解,以帮助大家构建完整的性能压测的理论 ...

  8. Chrome开发者工具详解(4)-Profiles面板

    Chrome开发者工具详解(4)-Profiles面板 如果上篇中的Timeline面板所提供的信息不能满足你的要求,你可以使用Profiles面板,利用这个面板你可以追踪网页程序的内存泄漏问题,进一 ...

  9. [转帖]前端-chromeF12 谷歌开发者工具详解 Sources篇

    前端-chromeF12 谷歌开发者工具详解 Sources篇 原贴地址:https://blog.csdn.net/qq_39892932/article/details/82498748 cons ...

  10. Chrome开发者工具详解(5)-Application、Security、Audits面板

    Chrome开发者工具详解(5)-Application.Security.Audits面板 这篇文章是Chrome开发者工具详解这一系列的最后一篇,介绍DevTools最后的三个面板功能-Appli ...

随机推荐

  1. C语言中的断言函数assert

    简介 assert 是 C 语言中的一个宏,用于在程序运行时进行条件检查,主要用于调试目的.它在 <assert.h> 头文件中定义,用于验证程序中的假设条件是否成立,如果不成立,程序将打 ...

  2. AMD 驱动安装 error 192解决问题

    AMD 驱动安装 error 192解决问题 环境:win10专业版.自动更新已禁止.硬件安装设置[是](window自动下载驱动) [以下环境均在安全模式下进行 (win+r msconfig,安全 ...

  3. 【CentOS】rpm包安装Jdk

    1.系统环境检查 前提情要:[如果是使用虚拟机的Linux系统,强烈建议先打个快照备份一下,以免操作失误无法重来] 首先查看系统是否存在java环境 java -version 因为点选了环境工具,这 ...

  4. pytorch报错:Variable._execution_engine.run_backward( # Calls into the C++ engine to run the backward pass RuntimeError: FIND was unable to find an engine to execute this computatio

    GPU模式下运行pytorch代码报错,pytorch为2.2.1,NVIDIA驱动版本535.161.07 File "/home/devil/anaconda3/envs/sample- ...

  5. 《Python数据可视化之matplotlib实践》 源码 第四篇 扩展 第十三章

    图  13.10 import matplotlib.pyplot as plt import matplotlib as mpl import numpy as np mpl.rcParams[&q ...

  6. 【转载】 linux中umask命令介绍

    版权声明:本文为CSDN博主「立二拆四i」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/weixin_4408 ...

  7. 【全】CSS动画大全之按钮【a】

    效果预览 代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> < ...

  8. CH04_程序流程结构

    CH04_程序流程结构 程序流程结构 C/C++支持最基本的三种程序运行结构: 顺序结构:程序按顺序执行,不发生挑战 选择结构:依据条件是否满足,有选择的执行相应的功能 循环结构:依据条件是否满足,循 ...

  9. redis集群主从之读写分离

    redis集群主从之读写分离 1.集群部署 这里就不详细赘述如何部署主从集群了,一般都是使用slaveOf配置来进行初始化配置. 2.与springboot集成实现读写分离 通过注解实现调用层读写分离 ...

  10. linux中级——libcurl库访问百度

    libcurl简介: libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议.libcurl同样支持H ...