Linux内核追踪[4.13] AIO的非阻塞优化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lovelycheng/article/details/78335546

      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仍然有不少工作要做。

参考:https://lwn.net/Articles/724198/
Patch集合:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=fdd2f5b7de2afaa931e5f7bad7bcda35d1f1b479
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=7fc9e4722435cd8459182c4975f48934f2bb1274
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9830f4be159b29399d107bffb99e0132bc5aedd4
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b745fafaf70c0a98a2e1e7ac8cb14542889ceb0e
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=6be96d3ad34a124450028dabba43f07fe1d0c86d
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a38d1243704f501a4c42de1db1062ff6eba83453
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=03a07c92a9ed9938d828ca7f1d11b8bc63a7bb89
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=728fbc0e10b7f3ce2ee043b32e3453fd5201c055
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=29a5d29ec181ebdc98a26cedbd76ce9870248892
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=edf064e7c6fec3646b06c944a8e35d1a3de5c2c3

猜你喜欢

转载自blog.csdn.net/lovelycheng/article/details/78335546