1. main
1.1 parse_options()
解析选项,更新数据结构
1.1.1 fio_init_options()
1.1.2 fio_test_cconv(&def_thread.o) <cconv.c>
1.1.2.1 convert_thread_options_to_cpu()
传递options给数据结构
1.1.3 parse_cmd_line()
switch语句多路选择,进行解析
1.1.3.1 add_job()
1.1.3.1.1 fixup_options(td)
判断选项是否冲突
1.2 fio_backend->run_threads->thread_main
run_threads创建主要的并行线程,建立IO 提交的线程 thread_main
1.2.1 init_iolog
初始化输入输出文件
1.2.2 verify_async_init
初始化数据验真的属性信息,后创建一个线程verify_async_thread,与io事务并行运行,进行io事务完成后的数据验真。
1.2.3 switch_ioscheduler
IO调度
1.2.4 fio_verify_init
不同架构下的fio crc校验的初始化
while(keep_running)
do_io()
主要的进行IO传输事务函数
populate_verify_io_u()
产生随机数据和header字段,并保存到 io_u->buf 中。
header字段保存了本次测试的属性,包括随机种子、是否verify、线程数、某类型的校验码等信息。
设置runstate
判断是否是读操作,若是则设置runstate进入TD_VERIFYING状态
io_u_submit(td, io_u)
调用实际存储引擎注册的io_submit 函数
io_queue_event()
判断当前是否还有没有处理完的io events
do_verify()
读取传输的block,检查crc/md5数据
td_set_runstate(td, TD_VERIFYING)
设置runstate进入TD_VERIFYING状态
get_next_verify()
等待一次事务完成
数据结构
runstate
fio测试运行类似于状态机的转换,状态机变量为runstate,有如下状态:
通用函数
业务函数
verify_async_thread
verify_async_init函数创建的新线程,与io事务并行运行,进行io事务完成后的数据验真。
verify_io_u
根据需求有多种验证模式。
verify_io_u_pattern
默认的验真方式,按字节进行对比验真。
verify_io_u_md5
verify_io_u_crc64
verify_io_u_sha1
基础函数
-
le32_to_cpu()
将32位数据进行大小端调整 -
io_u_set(td, io_u, IO_U_F_FREE)
将io_u中的flags设置为IO_U_F_FREE -
put_io_u
线程相关
- pthread_create
创建线程,由一个线程创建一个新线程同时运行。
参考链接:pthread_create函数详解
Define开关
- read_barrier()
根据指令集read_barrier有几种不同的实现指令,编译时注意指定指令集。