1. 程式人生 > >Linux核心追蹤[4.13] AIO的非阻塞優化

Linux核心追蹤[4.13] AIO的非阻塞優化

      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