Benchmark测试——fio——源码分析

1. main

1.1 parse_options()

解析选项,更新数据结构

1.1.1 fio_init_options()

1.1.2 fio_test_cconv(&def_thread.o)

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,有如下状态:
Benchmark测试——fio——源码分析_第1张图片

通用函数

业务函数

verify_async_thread

verify_async_init函数创建的新线程,与io事务并行运行,进行io事务完成后的数据验真。

verify_io_u

根据需求有多种验证模式。

verify_io_u_pattern

默认的验真方式,按字节进行对比验真。
Benchmark测试——fio——源码分析_第2张图片

verify_io_u_md5
verify_io_u_crc64
verify_io_u_sha1

基础函数

  1. le32_to_cpu()
    将32位数据进行大小端调整

  2. io_u_set(td, io_u, IO_U_F_FREE)
    将io_u中的flags设置为IO_U_F_FREE

  3. put_io_u

线程相关

  1. pthread_create
    创建线程,由一个线程创建一个新线程同时运行。
    参考链接:pthread_create函数详解

Define开关

  1. read_barrier()
    根据指令集read_barrier有几种不同的实现指令,编译时注意指定指令集。
    Benchmark测试——fio——源码分析_第3张图片

你可能感兴趣的:(CPU系统级验证,C语言)