AIO被人诟病得较多的是一些读写操作,会经常由于某些条件而阻塞,做不到真正的异步IO。Goldwyn Rodrigues提交的合入4.13中的patch对此做了优化,尽量做到AIO不阻塞。主要通过几个方法进行优化:
1) 进行AIO时,在iocb对象中引入一个新的flag成员(aio_rw_flags),该成员引入一个flag(RWF_NOWAIT)表示这次提交的IO(io_submit)需要尽可能的NOWAIT,即遇到阻塞的地方则返回EAGAIN。
2) io_submit中会将RWF_NOWAIT转换为kiocb->ki_flags成员的IOCB_NOWAIT。之后在FS层(如ext4/xfs/btrfs)和PageCache层,遇到IOCB_NOWAIT和阻塞的地方(如获取锁失败,把lock修改为trylock,DIRECTIO需要writeback之前的data等场景),均返回EAGAIN。
3) 继续往下走,kiocb->ki_flags成员的IOCB_NOWAIT flag在BIO层被转换为了REQ_NOWAIT flag,在遇到该标志且有阻塞时,返回EAGAIN。
这里从用户接口(io_submit)上新引入一个flag和iocb成员是为了避免对已有的应用程序造成影响。因为现有程序在未更改时对某些情况依然认为内核会阻塞而不会返回EAGAIN。另外,NOWAIT的AIO需要从MM(pagecache)层、FS层以及BIO层配合起来运行。目前文件系统层只修改了ext4/xfs/btrfs,还有其它的文件系统需要修改。BIO和MM层也不一定修改完全了。因此要达到完整的NOWAIT AIO仍然有不少工作要做。
参考:
Patch集合:
阅读(2135) | 评论(0) | 转发(0) |