FIO源码解读测试

article/2025/10/15 22:42:04

在磁盘测试中,fio是最常用的测试的工具,其下载网址为https://github.com/axboe/fio;
对于fio,其测试命令有许多,这个大家很容易就可以查到,此处不讲解具体的测试命令,
而是讲一下大概的源码框架。


        Fio的入口函数在fio.c的main函数,其结构如下所示:


fio.c文件:

int main(int argc,char*argvO,char*envp0){if(initialize_fio(envp))        //libfio.c 文件————进行fio初始化,有64位对齐、大端小端模式、hash、文件锁等return 1;if(fio_server_create_sk_key())        // server.c文件-为线程创建私有数据TSD-goto done;if(parse_options(argc,argv))         // read-to-pipe-async 文件-解析main函数的参数goto done_key;fio_time_init();                     // 初始化时钟相关if(nr_clients){set_genesis_time();if(fio_start_all_clients())          // 与一些驱动进行远程连接操作,例如SPKDgoto done_key;ret=fio_hanuie_clienis(&tio_cliei.t_ops);}elseret=fio_backend(NULL);           // backend.c 文件   fio 逻辑走向,开始处理问题
}


        fio_server_create_sk_key()函数是为线程创建私有数据,关于线程私有数据的概念可以参
考该链接-https://www.cnblogs.com/smarty/p/4046215.html;

接下来看一下fio_backend()函数——backend.c文件

int fio_backend(struct sk_out *sk_out) {......                                            //加载文件、mmap 映射、锁初始化、获取时间、创建helper线程、run_threads(sk_out);                             //会建立主要的I0线程......                                        //用于一些变量的销毁、环境的收尾
}


该函数中最主要的是run_threads(sk_out)函数,该函数会根据需要要启动jobs和处理 jobs,
比较重要,接下来看一下这个函数:
backend.c 文件:

 

static void run_threads(struct sk_out *sk_out)
{......                                                        // 在io线程之前设置其他线程、设置信号量
、缓冲、检查挂载、设置文件处理顺序、修改线程状态}else{pid_t pid;dprint(FD_PROCESS,"will fork\n");pid=fork();if(!pid){int ret;ret=(int)(uintptr_t)thread_main(fd);                             // 建立IO提交过程_exit(ret);}else if(i==fio_debug_jobno)*fio_debug_jobp=pid;}......                                                                               // 线程状态收尾
}


在上面中,最关键的是thread_main(fd)函数,其主要是建立了10提交过程;
backend.c 文件:

static void*thread_main(void *data)
{......                          //获取任务 pid,初始化时钟、锁,设置 uid,设置优先级(会影响内存分配),参数转换/初始化,if(td->o.verify_only && td_write(td))verify_bytes=do_dry_run(td);else{do_io(td,bytes_done);                // 进行IO的提交和处理过程if(!ddir_rw_sum(bytes_done)){fio_mark_td_terminate(td);verify_bytes=0;}else{verify_bytes=bytes_done[DDIR_WRITE]+bytes_done[DDIR_TRIM];}}......                             //超时保护,线程竞争锁,err处理
}




在该函数中,最重要的是 do_io(td,bytes_done)这个函数,其进行10的提交和进一步的处
理,接下来看一下该该函数:

static void do_io(struct thread_data *td,uint64_t *bytes_done)
{......                               //写模式字节数计算、10异常判断、验证end_io、记录IO动作else{ret=io_u_submit(td,io_u);               // 调用实际存储引擎注册的io_submit 函数if(should_check_rate(td))td->rate_next_io_time[ddir] = usec_for_io(td,ddir);if (io_queue_event(td,io_u,&ret,ddir,&bytes_issued,0,&comp_time))   //  判断当前是否还有没有处理完的io eventsbreak;                                  //判断是否进一步处理reap:full=queue_full(td)||(ret==FIO_Q_BUSY&& td->cur_depth);if(full || io_in_polling(td))ret=wait_for_completions(td,&comp_time);          //会调用后端实际存储引擎注册的getevents 函数......}
}


do_io 函数主要进行io_u的处理和排队,在此过程中会检查速率和错误,其返回被处理完的
字节数;该函数中有三处关键点,分别为io_u_submit()、io_queue_event()和
wait_for_completions()
.


首先看io_u_submit()函数:

static enum fio_q_status io_u_submit(struct thread_data *td,struct io_u *io_u)
{//   确保有一个IO运行在队列中if(td->o.serialize_overlap && td->cur_depth>1&&in_flight_overlap(&td->io_u_all,io_u))return FIO_Q_BUSY;return td_io_queue(td,io_u);
}enum fio_q_status td_io_queue(struct thread_data *td,struct io_u xio_u)
{//检查并释放锁、保存write io、错误处理、O_DIRECT添加警告声明等
}



接着看io_queue_event()函数:
 

int io_queue_event(struct thread_data*td,struct io_u *io_u,int*ret.
enum fio_ddir ddir,uint64_t*bytes_issued,int from_verify.
struct timespec*comp_time)
{//根据状态来确定处理逻辑-FIO_Q_COMPLETED/FIO_Q_QUEUED/FIO_Q_BUSY
}


接下来看下 wait_for_completions()函数:

static int wait_for_completions(struct thread_data *td,struct timespec *time)
{//队列满,则处理一个事件
do{ret=io_u_queued_complete(td,min_evts);                  //  io_u.c文件if(ret<0)break:}while(full &&(td->cur_depth>td->o.iodepth_low));
}int io_u_queued_complete(struct thread_data *td,int min_evts)        //调用异步10引擎来完成
min_events 事件
{ret=id_io_getevents(td,min_evts,td->o.iodepth_batch_complete_max,tvp);    //ioengines.c
文件-修复min_evts的min和max
}


上面就是fio的大概框架,更具体的需要研究每一个函数的细枝末节,本文不做过多讲解。

参考链接:
FIO线程模型【附源码】_存储之厨_51CTO博客FIO线程模型【附源码】,分享了fio测试框架的主要流程https://blog.51cto.com/xiamachao/2409539
 


http://chatgpt.dhexx.cn/article/cp36nZDa.shtml

相关文章

fio引发的一些问题

fio引发的一些问题 奇怪的255扇区在nvme驱动中插入打印语句直接编译模块加载源码编译内核 查找内核源码 奇怪的255扇区 由于块设备驱动项目需要测试读写速度&#xff0c;故使用fio工具&#xff0c;没想着深入了解&#xff0c;简单测个速就可以 使用tldr命令得到测试磁盘读写的…

【fio】关于磁盘性能测试

一、关于磁盘 磁盘是可以持久化存储的设备&#xff0c;根据存储介质的不同&#xff0c;常见磁盘可以分为两类&#xff1a;机械磁盘和固态磁盘。 第一类&#xff0c;机械磁盘&#xff0c;也称为硬盘驱动器&#xff08;Hard Disk Driver&#xff09;&#xff0c;通常缩写为 HDD。…

【测试】 FIO:ceph/磁盘IO测试工具 fio(iodepth深度)

目录 随看随用 NAS文件系统测试 块系统测试 FIO用法 FIO介绍 FIO 工具常用参数&#xff1a; FIO结果说明 I/O 的重放&#xff08;录下实际工况的IO&#xff0c;用fio重放&#xff09; fio工作参数可以写入配置文件 fio的iodepth参数说明 IO状态监控&#xff1a; Ios…

FIO详解

fio - Flexible IO Tester 一、服务器配置&#xff1a; 由于我们想通过fio得到SSD真实的参数信息&#xff0c;因此我们需要服务器BIOS一些参数的配合&#xff0c;以便能更好的体现硬盘的性能。 以华为1288HV5为例&#xff1a; 二、fio 1.安装 a.下载地址&#xff1a;htt…

FIO 存储性能压测

一、 FIO简介 FIO 是一个多线程IO生成工具&#xff0c;可以生成多种IO模式&#xff08;随机、顺序、读、写四大类&#xff09;&#xff0c;用来测试磁盘设备的性能。GFIO是FIO的图形监测工具&#xff0c;它提供了图形界面的参数配置&#xff0c;和性能监测图像。 在github上的…

磁盘性能测试工具-FIO的安装及使用

文章目录 FIO介绍FIO安装在线安装离线安装 磁盘测试命令行方式测试结果说明命令参数说明配置文件方式 dd命令介绍使用方法 FIO介绍 FIO是一款测试IOPS的工具&#xff0c;用于对磁盘进行压力测试和验证&#xff0c;磁盘I/O是检查磁盘性能的重要指标&#xff0c;可以按照负载情况…

NuGet学习笔记(1)——初识NuGet及快速安装使用

http://kb.cnblogs.com/page/143190/ 1. NuGet是什么&#xff1f; NuGet is a Visual Studio 2010 extension that makes it easy to add, remove, and update libraries and tools in Visual Studio projects that use the .NET Framework. This topic lists documentation t…

Nuget路径问题

VS NetGet包管理器 问题场景&#xff1a; 装了两遍VS2019,第一次装D盘卸载了&#xff0c;然后装C盘&#xff0c;结果生成 .netCore项目时就悲剧了&#xff0c;报错&#xff1a;error MSB4018: “ResolvePackageAssets”任务意外失败。Microsoft.PackageDependencyResolution.t…

使用nuget 打包并上传 nuget.org

使用nuget 打包并上传 nuget.org 一、准备工作二、打包你的项目三、上传 nug.org 服务器 前言&#xff1a;今天又玩了个新东西&#xff0c;那就是 使用nuget 打包并上传 nuget.org&#xff0c;在这里即时记录一下&#xff0c;废话不多说&#xff0c;直接上教程。 一、准备工作…

nuget 的生成、发布、使用和更新

nuget 的生成、发布、使用和更新 一、nuget 的生成1.生成.dll1.1创建.net项目&#xff08;类库&#xff09;1.2 打包生成 .dll 2.打包成.nupkg文件2.1安装 [NuGetPackageExplorer.exe](https://github.com/NuGetPackageExplorer/NuGetPackageExplorer)程序2.2打开软件,完成打包…

修改NuGet包默认存放位置

默认情况下&#xff0c;NuGet下载的包存放在系统盘(C盘中)&#xff0c;这样一来&#xff0c;时间长了下载的包越多&#xff0c;C盘占用的空间也就越多。 1、问题描述 默认情况下&#xff0c;NuGet下载的包存放在系统盘(C盘中&#xff0c;一般在路径C:\Users\用户\.nuget\packag…

Nuget使用简介

1.什么是Nuget Nuget是 ASP .NET Gallery 的一员。NuGet 是免费、开源的包管理开发工具&#xff0c;专注于在 .NET 应用开发过程中&#xff0c;简单地合并第三方的组件库。 当需要分享开发的工具或是库&#xff0c;需要建立一个Nuget package&#xff0c;然后把这个package放到…

Nuget的使用说明

在做项目的时候&#xff0c;经常需要添加一些第三方引用&#xff0c;Visual Studio 2019环境下&#xff0c;最推荐的是Nuget安装方式&#xff0c;好处就是可以将所有依赖的包全部打包下载安装。 1.nuget.org&#xff0c;搜索需要的nuget包&#xff0c;复制相应的安装命令&…

NuGet的了解

目录 1..NuGet 的使用目的 2..Net 的工具 NuGet 1.NuGet 包的下载 2.NuGet 包的分析 3.NuGet 的使用 1.通过命令行使用 2.在 visual studio 里通过图形化界面进行添加。 3.在添加包的时候 4.特点 1..NuGet 的使用目的 在引入第三方程序集&#xff08;dll&#xff09;的…

初识NuGet - 概念, 安装和使用

1. NuGet是什么&#xff1f; NuGet is a Visual Studio 2010 extension that makes it easy to add, remove, and update libraries and tools in Visual Studio projects that use the .NET Framework. This topic lists documentation that will help you use NuGet packages…

NuGet的介绍及使用

介绍 NuGet是什么&#xff1f; NuGet是.NET的软件包管理器。NuGet客户端工具提供了生成和使用软件包的功能。NuGet 是所有软件包作者和使用者都使用的中央软件包存储库。 下面是百度百科的介绍 在我看来NuGet类似于Java的Maven和Javascript的npm。 使用 1、通过图形化客户端安…

NuGet包介绍

前言 什么是NuGet&#xff1f; NuGet是.NET的软件包管理器。NuGet客户端工具提供了生成和使用软件包的功能。NuGet Gallery是所有软件包作者和使用者都使用的中央软件包存储库。 包的安装和卸载 (以Newtonsoft.Json举例) 1.控制台 安装&#xff1a;Install-Package Newtonsoft…

NuGet使用

1.创建类库方法 2.双击项目配置 <Project Sdk"Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>net6.0</TargetFramework><ImplicitUsings>enable</ImplicitUsings><Nullable>enable</Nullable><!--以下是…

NuGet学习

NuGet学习 文章目录 NuGet学习1.简介2.Visual Studio安装3.安装包3.1 打开NuGet3.2 搜索安装包 4.使用包 1.简介 NuGet包是一个zip文件&#xff0c;其中包含程序集&#xff08;或多个程序集&#xff09;、配置信息和PowerShell脚本。NuGet包可以从微软找到&#xff0c;也可以从…

什么是nuget?nuget包是如何管理

做windows开发的&#xff0c;迟早会接触到nuget这个东西&#xff0c;那么今天我们就来研究一下什么是nuget&#xff1f; 我们先从另外一些大家熟悉的概念入手&#xff0c;做linux的大家应该应该听说过apt-get&#xff0c;yum&#xff0c;deb等等&#xff0c;是的这些都是包管理…