Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104237
  • 博文数量: 17
  • 博客积分: 30
  • 博客等级: 民兵
  • 技术积分: 241
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-06 13:16
个人简介

- -

文章分类

全部博文(17)

文章存档

2014年(9)

2013年(7)

2012年(1)

我的朋友

分类: 其他平台

2014-07-26 21:44:57

fio命令参数:
-direct=1, 开启DIRECT_IO, 不作buffer, mola_test.py中都有开启


backend.c,
fio_backend() =>
thread_main() =>
fio_io_sync()/ fio_io_fsync()


init.c,
add_job_opts() =>
add_job() =>
每个job生成一个td, 每个td分配nr_files个文件
if (o->nr_files == 1 && exists_and_not_file(jobname))
add_file(td, jobname, job_add_num, 0)
对cmd0, cmd6, 只创建一个文件, 文件名即jobname
else
nr_files即要创建的文件数
out = make_filename(fname, sizeof(fname), o, jobname, job_add_num, i)
创建文件名"jobname.job_add_num.filenum"
job_add_num在add_job_opts()中调用时, 作为首次调用, 是0
filenum范围0~nr_files-1
add_file(td, out, job_add_num, 0)

add_job() 递归调用add_job(),
受到fio参数numjobs影响, 一共生成的job总数
在主测试任务cmd1中, numjobs=30~60 不等

filesetup.c,
int add_file(struct thread_data *td, const char *fname, int numjob, int inc)
生成文件 "fname/fname"
fio_file->file_name = "fname/fname"

Q1. fio, 创建文件, 是否经过文件系统, 文件名, 命名规则?
Q2. libaio, 创建文件LBA范围, 接口, 下层文件系统通信, 优化, ...

A1. fio有DIRECT_IO的选项, 目前都没有使用, 默认没有开启DIRECT_IO, 所以肯定会经过文件系统.
测试文件命名:
对选项nr_files=1, 创建文件"jobname/jobname"
对选项nr_files>1, fname="jobname.0.N", N的范围从0~nr_files-1,
最终创建N个文件 "jobname.0.N/jobname.0.N"
jobname由fio选项"name"设置

A2. libaio最终是在内核中实现的接口, 无法得知会具体分配的LBA范围.

Q3. 每个thread每次读写对应的文件个数
使用系统级io_getevents()/io_submit()接口,
fio中线程只负责提交, 具体读写进程的并发情况完全由内核控制

libaio工作流程:
io_prep_pread()/io_prep_pwrite() 设置读写操作参数
io_submit() 提交
io_getevents() 检查结果


fio的iodepth选项, 控制入队的entry个数,
=100, 允许一次最多入队100个,
fio_libaio_queue(), engines/libaio.c,
达到iodepth, 直接退出queue()

------------------------------------------

fio
最终最大queue数 = iodepth
最终thread数 = numjobs,
每个thread独自维护nr_files个文件
最终每个job文件数 = numjobs * nr_files



fio, 读写方向控制
-rw=randrw
TD_DDIR_READ | TD_DDIR_WRITE | TD_DDIR_RAND, io_ddir.h
static void run_threads(void), backend.c,
td_read(td)
(td)->o.td_ddir & TD_DDIR_READ

实际读写
thread_main() =>
td_io_prep()

int td_io_prep(struct thread_data *td, struct io_u *io_u), ioengines.c
=>
td->io_ops->prep(),

对libaio,
static int fio_libaio_prep(struct thread_data fio_unused *td, struct io_u *io_u
engines/libaio.c
根据io_u->ddir == DDIR_READ或DDIR_WRITE, 调用系统接口
io_prep_pread()/io_prep_pwrite()
系统接口, 内核中有实现, 没有MAN页, 参考libaio库代码/文档
libaio.h, 构造struct iocb, IO_CMD_PREAD/IO_CMD_PWRITE, 没有调用其他函数




---------------------------------------


aio接口, fs/aio.c,
SYSCALL_DEFINE5(io_getevents, ...)

SYSCALL_DEFINE3(io_submit, aio_context_t, ctx_id, long, nr,
struct iocb __user * __user *, iocbpp)
for (i=0; i io_submit_one(ctx, user_iocb, &tmp)


static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,
struct iocb *iocb)
struct kiocb *req = aio_get_req(ctx)
aio_setup_iocb(req)
对IOCB_CMD_PREAD/IOCB_CMD_PWRITE,
rw_op = file->f_op->aio_read
rw_op = file->f_op->aio_write
aio_run_iocb(req) =>
aio_queue_work(ctx) =>
queue_delayed_work(aio_wq, &ctx->wq, timeout),
work queue延时回收资源iocb等
while (__aio_run_iocbs(ctx))


EXT2
fs/ext2/file.c,
const struct file_operations ext2_file_operations = {
.aio_read = generic_file_aio_read
.aio_write = generic_file_aio_write
}

















阅读(8352) | 评论(0) | 转发(0) |
0

上一篇:flashcache conclusion

下一篇:没有了

给主人留下些什么吧!~~